python网络爬虫的总结

345次阅读
没有评论
python网络爬虫的总结

[Python]网络爬虫总结

本文将对Python网络爬虫进行简要的总结,涵盖了我目前所使用的所有方法。

静态网页

对于静态网页,就不多说了,太简单了。只要用requests库直接把html爬下来,然后用正则表达式匹配即可。但是到了目前互联网发展阶段,已经很少有静态网页了。如果你遇到要爬虫静态网页,那你一定是非常幸福了。

动态网页

动态网页是比较常见的爬虫目标,这里我给出一些比较常见的爬虫方法,仅供参考。

爬取数据包

一般来说,要爬虫的内容都是在格式上具有一定的重复性,但同时数据量又非常大。如果你曾经做过网页开发,你就会明白网页开发者对于这样的数据,一般都会采取从服务器发数据包到前端,在前端解析数据的方式来实现,于是这就给了爬虫者巨大的便利。因为一旦我找到了数据包的请求方式,我就可以仿照前端发送相同的请求,来获得相应的JSON数据。

具体的例子,可见我博客中爬取京东商品评论的文章,对此有详细的介绍。

Selenium

但是,并不是什么时候都能找到数据包发送请求的方式,或者有的时候,网页开发者并没有使用这样的方法。那么,在这种情况下,就需要采取别的方法,这里我认为最简单的方法就是使用Selenium。具体的安装不在此赘述。

举例,假设我希望爬虫雪球网文章的正文部分,有兴趣的朋友可以研究一下这个网站,看看能不能找到正文数据的发送请求。

代码就非常简单了。

import 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 = "https://xueqiu.com"

for eachItem in directoryData:

driver.get(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)

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'] = 'http://' + IP_array[index][0] + ':' + IP_array[index][1]

print(IP_array[index][0])

return proxies

def get_new_IP():

r = session.get('http://www.xicidaili.com/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 = session.get('http://ip.chinaz.com/getip.aspx', proxies=random_IP(IP_array))

print(r.text)

except Exception as e:

print(e)

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-24发表,共计2284字。
新手QQ群:570568346,欢迎进群讨论 Python51学习