python⽹络爬⾍的总结_[Python]⽹络爬⾍总结
[Python]⽹络爬⾍总结
本⽂将对Python⽹络爬⾍进⾏简要的总结,涵盖了我⽬前所使⽤的所有⽅法。
静态⽹页
对于静态⽹页,就不多说了,太简单了。只要⽤requests库直接把html爬下来,然后⽤正则表达式匹配即可。但是到了⽬前互联⽹发展阶段,已经很少有静态⽹页了。如果你遇到要爬⾍静态⽹页,那你⼀定是⾮常幸福了。
动态⽹页
动态⽹页是⽐较常见的爬⾍⽬标,这⾥我给出⼀些⽐较常见的爬⾍⽅法,仅供参考。
爬取数据包
⼀般来说,要爬⾍的内容都是在格式上具有⼀定的重复性,但同时数据量⼜⾮常⼤。如果你曾经做过⽹页开发,你就会明⽩⽹页开发者对于这样的数据,⼀般都会采取从服务器发数据包到前端,在前端解析
数据的⽅式来实现,于是这就给了爬⾍者巨⼤的便利。因为⼀旦我到了数据包的请求⽅式,我就可以仿照前端发送相同的请求,来获得相应的JSON数据。
具体的例⼦,可见我博客中爬取京东商品评论的⽂章,对此有详细的介绍。
Selenium
但是,并不是什么时候都能到数据包发送请求的⽅式,或者有的时候,⽹页开发者并没有使⽤这样的⽅法。那么,在这种情况下,就需要采取别的⽅法,这⾥我认为最简单的⽅法就是使⽤Selenium。具体的安装不在此赘述。
举例,假设我希望爬⾍雪球⽹⽂章的正⽂部分,有兴趣的朋友可以研究⼀下这个⽹站,看看能不能到正⽂数据的发送请求。
代码就⾮常简单了。
import json
python请求并解析json数据import time
from selenium import webdriver
directoryFile = open('./TopLine_directory/directory.json', 'r', encoding='utf-8')
directoryData = json.load(directoryFile)
driver = webdriver.Chrome()
baseUrl = "xueqiu"
威斯布鲁克是哪一年的新秀for eachItem in directoryData:
<(baseUrl + eachItem['target'])
title = driver.find_element_by_class_name("status-title").text
info = driver.find_element_by_class_name("status-content").text
f = open('./TopLine_directory/paper/' + title + '.txt', 'w', encoding='utf-8')
print(title + "finished!")
f.write(info)
springboot技术f.close()
time.sleep(2)
优化
如果很快速地对⼀个⽹站进⾏爬⾍,很容易就会被封IP。那么,必须采取有效的⽅法来避免被封锁。⾸先我必须强调的是,不管采取什么⽅法,都应该遵守君⼦协议,不对⽹站进⾏疯狂地访问以增加服务器压⼒。
其中⼀个⽅法,就是控制速度。但是这个⽅法只能解决⼀点点问题,因为服务器会很容易地认为这是⼀个robot,于是对其进⾏封锁。但是必要的控制速度是对⽹页开发者的尊重。
另⼀个⽹页就是更改IP。但我在实践过程中发现,就算更改IP,服务器还是会对其进⾏封锁。有可能是我⼀直采⽤同样的cookie,导致服务器能够发现robot。但是伪造合适的cookie,似乎不是这么简单的事情,以后我解决了再说吧。
import requests
import random
import re
session = requests.session()
session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
def random_IP(IP_array):
proxies = {}
index = random.randint(0, len(IP_array) - 1)
proxies['http'] = '' + IP_array[index][0] + ':' + IP_array[index][1]
上海市计算机二级c语言题库print(IP_array[index][0])
return proxies
def get_new_IP():
r = ('www.xicidaili/nn')
IP = re.findall(r'
(([0-9]|\.)*)', r.text)
IP_array = []
for i in range(len(IP)):
if i % 2 == 0:
IP_array.append([IP[i][0], IP[i + 1][0]])
return IP_array
IP_array = get_new_IP()
while True:
try:
r = ('ip.chinaz/getip.aspx', proxies=random_IP(IP_array))
)
门户网站首页素材except Exception as e:
正则化入门教程print(e)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论