文章目录
(一)写爬虫的一些套路
1. 准备url
1.1 准备start_url
(1) url地址规律不明显,或总数不确定时
李毅贴吧,点击下一页时,对应的url地址的pn会增加50,但不确定李毅吧的总数是多少,故需要准备start_url
start_url = https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}
使用 start_url.format 对{}进行替换,实现动态更换页码
(2)通过代码提取下一页的url
1)xpath(重点)
xpath("//a[text()='下一页']/@href") 直接获取到下一页的url地址
图中可以看到下一页的url地址对应的pn=100,即第三页
2)寻找url地址,部分参数在当前的响应中,比如,当前页码和总的页码数在当前的响应中
可以看到每次请求的数量为count=18 总数total=1015
故代码中 需要获取total,然后用一个num来记录一共请求的数量(num+=18)
根据 num<total 进入循环,当num>=total时,则循环结束,所有的页面都被抓取下来。
1.2 准备 url_list
(1) 页码总数明确
(2)url地址规律明显
举一个栗子 糗事百科
url_temp = https://www.qiushibaike.com/text/page/{}/
url_list = url.temp.format(i) for i in range(1,14)
这样可以拿到糗事百科所有的链接组成的列表
for url in url_list 就可以拿到每一个url地址
2. 发送请求,获取响应
1.requests.get(url,headers,params,proxies,auth,,cookie..)
params : 将参数放在url中传递,可以使用params
比如 kw = {'wd':'长城'} requests.get("https://www.baidu.com/s?",headers= headers,params=kw) 相当于请求https://www.baidu.com/s?wd='长城'
proxies :添加代理ip
比如:proxies={'http':"http://12.34.56.79:9527",
"https":"https://12.34.56.79:9527"}
requests.get(url,headers=headers,proxies=proxies)
auth:账户密码登录
比如:auth={"test","123465"}
requests.get(url,headers=headers,auth=auth)
cookie:添加cookie
比如:
test.txt 里面直接放有
__cur_art_index=1600; _ga=GA1.2.97777798.1555168736; _gid=GA1.2.607144467.1555168736; Hm_lvt_18a964a3eb14176db6e70f1dd0a3e557=1555168894; _xsrf=2|71c6fa81|71d328e36d68bb652ab98854a1f2be71|1555203682; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1555168705,1555203878; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1555203878
f=open(r'test.txt','r')#打开所保存的cookies内容文件
cookies={}#初始化cookies字典变量
for line in f.read().split(';'): #按照字符:进行划分读取
#其设置为1就会把字符串拆分成2份
name,value=line.strip().split('=',1)
cookies[name]=value #为字典cookies添加内容
然后requests.get(url,cookies=cookies) 就是添加了cookies
cookie={__cur_art_index=1600; _ga=GA1.2.97777798.1555168736; _gid=GA1.2.607144467.1555168736; Hm_lvt_18a964a3eb14176db6e70f1dd0a3e557=1555168894; _xsrf=2|71c6fa81|71d328e36d68bb652ab98854a1f2be71|1555203682; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1555168705,1555203878; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1555203878}
2.requests.post(url,data)
data 里面可以添加 很多信息,它相当于一个字典,里面可以放有很多的参数(比如headers,代理等),然后一起发送请求。
2.1 添加随机的User-Agent,反反爬虫
使用chrome 抓包工具就可以拿到我们当前浏览器所对应的User-Agent
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
2.2 添加随机的代理Ip,反反爬虫
proxies :添加代理ip
比如:proxies={'http':"http://12.34.56.79:9527",
"https":"https://12.34.56.79:9527"}
requests.get(url,headers=headers,proxies=proxies)
2.3 在对方判断出我们是爬虫之后,应该添加更多的headers字段,包括cookie
test.txt 里面直接放有
__cur_art_index=1600; _ga=GA1.2.97777798.1555168736; _gid=GA1.2.607144467.1555168736; Hm_lvt_18a964a3eb14176db6e70f1dd0a3e557=1555168894; _xsrf=2|71c6fa81|71d328e36d68bb652ab98854a1f2be71|1555203682; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1555168705,1555203878; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1555203878
f=open(r'test.txt','r')#打开所保存的cookies内容文件
cookies={}#初始化cookies字典变量
for line in f.read().split(';'): #按照字符:进行划分读取
#其设置为1就会把字符串拆分成2份
name,value=line.strip().split('=',1)
cookies[name]=value #为字典cookies添加内容
然后requests.get(url,cookies=cookies) 就是添加了cookies
2.4 cookie的处理可以使用session来解决
ssion = requests.session()
session.get(url,headers,..)
2.5 准备一堆能用的cookie,组成cookie池
(1)不需要登录的情况
1)准备刚开始能够成功请求对方网站的cookie,即接收对方网站设置在response的cookie
2)下一次请求的时候,使用之前的列表中的cookie来请求
(2)需要登录的情况
1)准备多个账号
2)使用程序获取每个账号的cookie
3)之后请求登录之后才能访问的网站随机的选择cookie
3. 提取数据
3.1 确定数据的位置
(1)如果数据在当前的url地址中
1)提取的是列表页的数据
① 直接请求列表页的url地址,不用进入详情页
即你需要的数据的,比如内容,标题信息都在当前列表页能够获取到
2)提取的是详情页的数据
即你需要的数据,比如图片等信息被放在了详情页,你想同时获取列表页的标题信息和详情页的图片信息,则需要以下几个步骤。
① 确定url
② 发送请求
③ 提取数据
④ 返回
(2)如果数据不在当前的url地址中
1)在其他的响应中,寻找数据的位置
① 从network中从上往下找
② 使用chrome中的过滤条件,选择出了js,css,img之外的按钮
③ 使用chrome的search all file,搜索数字和英文,(中文有可能会给转码,有些时候不能直接搜索到中文)
3.2 数据的提取(重点考虑xpath)
(1)xpath,从html中提取整块的数据,先分组,之后每一组再提取
举个例子 糗事百科
获取当前页面所有的div列表 content_list = html.xpath("//div[@id='content-left']/div")
for div in content_list: #依次遍历
item={} # 置空一个字典
item["content"] = div.xpath(.//div[@class='content']/span/text()") # 获取文字
item["num"]=div.xpath(".//div[@class='stats-vote']/i/text()") # 获取数量
item["num"]=item["num"][0] if len(item["num"])>0 else None # 判断数量是否为空,若为空则定义为None 可防止顺序错乱
content_list.append(item) #追加到一个列表当中
(2)re(正则表达式),提取max_time,price,html中的json字符串
(3)json
4. 保存
4.1 保存在本地,text,json,csv
以json文件为例
with open("qiushi.json","a",encoding="utf-8") as f:
for content in content_list:# content_list是承接上面数据提取所得到的一个数据列表,遍历这个数据列表
f.write(json.dumps(content,ensure_ascii=False,indent=2))# 写入到数据列表中,json.dumps可以将python对象转换为json,ensure_ascii = False 目的是为了取消默认编码为ascii,indent =2 是让保存在txt文件的数据,以两个空格的进行缩进
f.print("\n")
这样的话将所有的数据块都保存在了qiushi.json中
4.2 保存在数据库 mysql,MongoDB,Redis
今天的文章实现爬虫的主要流程_最简单的爬虫代码分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85955.html