学习爬虫的过程中练习爬取网页的HTTP协议请求大多数是get,相比post请求来说获取数据量小受浏览器限制。所以现在采用多线程爬取的方式来提高get获取的速度
get请求与post请求的一般区别:
get方法:
1、用来请求资源
2、url中传输实体数据
3、传输的数据量小(受浏览器限制)
post方法:
1、用来传输实体数据(本质上更专业)
2、在实体中传输数据
3、传输的数据量大
我在这里给大家介绍糗事百科的多线程爬取
糗事百科网址:https://www.qiushibaike.com/hot/page/1/
利用了第三方库requests
# 模拟headers信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'}
# 解析和存储信息
with open('F:\\糗事百科\\第{}页.txt'.format(page), 'w', encoding='utf-8') as f:
for i in re.findall('<div class="content">\s+<span>(.*?)</span>', response.text, re.S):
f.write(re.sub('\s+|<br/>', ' ', i) + '\n\n')
下面展示完整代码:
# -*- coding: utf-8 -*-
import requests
import re
import threading
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'}
count = 0
def get_content(page):
global count
count += 1
url = 'https://www.qiushibaike.com/hot/page/{}/'.format(page)
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
with open('F:\\糗事百科\\第{}页.txt'.format(page), 'w', encoding='utf-8') as f:
for i in re.findall('<div class="content">\s+<span>(.*?)</span>', response.text, re.S):
f.write(re.sub('\s+|<br/>', ' ', i) + '\n\n')
if __name__ == '__main__':
for i in range(1, 14):
t = threading.Thread(target=get_content, args=(i,))
t.start()
效果如图: