0%

Python爬虫

爬虫(Web Crawler)

郑重声明:本文仅限于编程学习,用于非法目的及造成侵权后果的行为,老子概不负责

http请求

私以为,爬虫程序就是以程序执行代替人工操作,在一定范围的网络资源中找自己要的东西。当人做这项枯燥的工作时,无非输入网址—打开网页—用肉眼识别—下载这样子,下面基本上就是用python模拟这个过程。

1
2
3
4
5
6
7
8
9
10
import requests
import re
response = requests.get('https://qqstone.github.io/qqsnote/2019/10/28/MySQL/')
print(response.text)
if response.text.find('主键'):
print('find it!')
keyUnicode = str('主键'.encode('unicode_escape')).replace('\\\\','\\')[2:14]
print('\S*'+keyUnicode+'\S*')
matchObj = re.findall('\S*'+keyUnicode+'\S*',response.text)
print(matchObj)

反“反爬设置”

有时请求一个网页时,发现无论通过Get或Post以及其他请求方式,都会出现403错误。这种现象多数是由于服务器拒绝了访问,因为这些网页为了防止恶意采集信息,所用的反爬虫设置。

此时可以通过模拟浏览器的header信息来进行访问。

1
2
3
4
5
6
import requests
import re
url='https://www.acfun.cn/a/ac12293064'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}
response = requests.get(url,headers=headers)
print(response.text)

上述只是针对user agent检测的手段,通常网站管理员采取的反爬虫基本手段还有封锁IP,检测请求间隔,封锁cookie等,针对这些手段需要采取相应的措施如使用代理,使用sleep模拟点击控制间隔,禁用cookie等

超时处理

使用代理

解析html树

Scrapy框架

依赖:

1
2
3
4
5
pip install Twisted
# windows平台用下面这个
pip install Twisted[windows_platform]

pip install Scrapy

参考 Scrapy文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import scrapy
import re


class QuotesSpider1(scrapy.Spider):
name = "quotes1"
keyword = ""
pages = 75

def start_requests(self):
url = 'https://xxxxxxx.xxx.html'
yield scrapy.Request(url=url, callback=self.parse)
for i in range(2, self.pages):
surl = url.replace('.html', '-'+str(i)+'.html')
yield scrapy.Request(url=surl, callback=self.parse_key_word)

def parse(self, response):
regexp = r'\d{2}'
video_list_tags = response.css('h3::attr(title)')
for vt in video_list_tags:
#if vt.extract().find(self.keyword) >= 0:
match_array = re.findall(regexp, vt.extract())

if len(match_array):
self.log(vt.extract())
filename = 'output.log'
with open(filename, 'a', encoding='utf-8') as f:
f.write(vt.extract()+'-->'+response.url+"\n")

def parse_key_word(self, response):
video_list_tags = response.css('h3::attr(title)')
for vt in video_list_tags:
if vt.extract().find(self.keyword) >= 0:
self.log(vt.extract())
filename = 'output.log'
with open(filename, 'a', encoding='utf-8') as f:
f.write(vt.extract() + '-->' + response.url + "\n")


执行scrapy实例
1
scrapy crawl quotes1