Python 自学爬坑,今天刚刚接触正则表达式,以前写的入门级爬虫都是用xpath解析,现在发现正则也还蛮实用,只是一大堆符号还需要时间慢慢掌握,截止目前,仅会使用’.*?'走天下。
使用正则解析某网站,并写入数据库,写完了这个,准备用面向对象爬某dou瓣top250~手动狗头。
爬取网站之前的准备流程:
1.研究正常用户浏览网页数据的步骤
2.研究网站数据的加载方式,例如:静态页面、js动态加载…
3.测试普通的请求能否拿回数据
4.研究网站数据加载规则及反爬措施,例如:携带cookie、携带指定参数、携带签名认证…
5.开始编写爬虫项目
码子不是很长,索性一并放上来,后面会有图片解析~ Let’s do it!!
import requests##引入请求库
import re#引入正则
import sqlite3#引入sqlite3数据库
import time#引入时间模块,控制访问速度
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'
}#请求头
url = 'https://www.qiushibaike.com/hot/'#起始页地址
db = sqlite3.connect('QSBK.db')#连接数据库,如没有同名数据库,则默认建立
cursor = db.cursor()#连接数据库游标
create_sql = "CREATE TABLE IF NOT EXISTS QSBK_DATA (ID INTEGER PRIMARY KEY,段子作者 VARCHAR(20),作者年龄 INTEGER (10),内容 VARCHAR )"##创建数据库sql语句
cursor.execute(create_sql)##执行sql语句
while True:###因之后要翻页,遂循环
response = requests.get(url,headers=headers)#请求返回数据
time.sleep(1)
html = response.text#将获取到的网页源代码内容的文本定义给一个变量html,以便解析
pattern = re.compile(r'h2>(.*?)</h.*?>(\d\d)</div>.*?<span>(.*?)</span>',re.S)#编写正则表达式规则,提取作者,作者年龄,内容
result = re.findall(pattern,html)###findall()函数 查找所有结果,得到一个列表,包含元组数据,元组里包含的就是作者,作者年龄,内容
for idx,info in enumerate(result):#枚举法 遍历结果内的所有内容,其实枚举法并无必要 也就是练习一下
#print(idx,'\n',author,age,'\n',content.strip('\n').replace('<br/>','\n'))#测试输出结果
author = info[0]
age = info[1]
content = info[-1]
print('正在将爬取内容写入导数据库.')
print('✿'*80)
insert_sql = f"INSERT INTO QSBK_DATA (段子作者,作者年龄,内容) VALUES ('{author}',{age},'{content}')"##建立sql语句,数据插入到数据库
cursor.execute(insert_sql)##执行sql语句
db.commit()##提交执行
ul_pattern = re.compile(r'<ul class="pagination">.*?</ul>',re.S)#查找下一页,因ul标签里包含数据结构相同,先编写正则表达式提取ul标签包裹的内容
ul_result = re.search(ul_pattern,html)#获取结果,正则表达式的search()函数,得到的会是一个对象
#print(ul_result.group()) 如需输出结果 ,需调用group()函数
next_pattern = re.compile(r'a href="(.*?)".*?next">(.*?)</span>',re.S)#编写下一页的正则式
next_result = re.findall(next_pattern,ul_result.group())#根据正则表达式 提取下一页的短网址以及文字'下一页'
time.sleep(1)
if next_result:##如果下一页的结果为真为True
url ='https://www.qiushibaike.com' + next_result[0][0]#那么拼接下一页的完整网址
print('正在爬取下一页内容....')
print('■'*50)
else:
print('爬取完成!')
print('☀'*50)
cursor.close()##关闭数据库游标
db.close()##关闭数据库
break
作者及内容正则表达式编写↓↓↓↓↓↓↓
下一页正则表达式编写↓↓↓↓↓↓↓↓
将下一页短址从列表+元组按照索引提取↓↓↓↓↓↓
获取下一页网之后 重新开始循环↓↓↓↓↓↓↓↓↓↓↓↓
数据库界面↓↓↓↓↓↓↓↓
ps:可能访问过快,截止发稿前,已经connection error~