开往未来的列车|Python爬虫快速入门,静态网页爬取( 六 )


5.1 使用time.sleep()降低爬取速度time.sleep(secs)函数推迟调用线程的运行 , 可通过参数secs(秒数)来进行设置 。
我们先来看一个例子:
import timefor i in range(0, 10):print(i)time.sleep(1)12345运行后 , 终端先是输出0 , 之后每隔1秒输出一个数字 。 倘若不加上time.sleep(1) , 那么这10个数字会在“一瞬间”打印出来 。 显然 , time.sleep()延迟了打印这个操作 。
利用这个特点 , 我们可以在之前爬取豆瓣图书Top250的代码中使用time.sleep() , 以降低爬取速度 , 防止被封:
import requestsfrom bs4 import BeautifulSoupfrom time import sleep as pausedef spider(url, filename):headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get(url, headers=headers)soup = BeautifulSoup(re.text, 'html.parser')items = soup.select('div.pl2 a')with open(filename, 'a', encoding=re.encoding) as f:for item in items:line = item['title'] + " " + item['href'] + "\n"f.write(line)for i in range(0, 250, 25):douban_book = '?start=%s' % str(i)spider(douban_book, 'doubanTop250.txt')pause(1)12345678910111213141516171819202122这样我们就可以每隔1秒爬取一页 , 降低了访问频率 。
5.2 IP代理除了降低访问频率之外 , 我们也可以使用代理来解决IP限制的问题 。 代理的意思是通过别的IP访问网站 。 这样 , 在IP被封后我们可以换一个IP继续爬取数据 , 或者每次爬取数据时都换不同的IP , 避免同一个IP访问的频率过高 , 这样就能快速地大规模爬取数据了 。
如何使用代理呢?请看下例:
import requestsproxies = {"http": "","https": "",}requests.get("", proxies=proxies)12345678和headers一样 , 我们同样需要定义一个字典 , 但传递的是proxies参数 。 我们需要将http和https这两种协议作为键 , 对应的IP代理作为值 , 最后将整个字典作为proxies参数传递给requests.get()方法即可 。
注:IP代理有免费的和收费的 , 你可以自行在网上寻找 。
在爬取大量数据时我们需要很多的IP用于切换 。 因此 , 我们需要建立一个IP 代理池(字典列表) , 每次从中随机选择一个传给proxies参数 。
因此 , 使用IP代理并结合time.sleep()爬取豆瓣图书Top250再将其写入文件的完整代码如下:
import requestsfrom random import choicefrom bs4 import BeautifulSoup as BeSfrom time import sleep as pausedef spider(url, filename, proxies):headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get(url, proxies=proxies, headers=headers)soup = BeS(re.text, 'html.parser')items = soup.select('div.pl2 a')with open(filename, 'a', encoding=re.encoding) as f:for item in items:f.write(item['title'] + " " + item['href'] + "\n")filename = 'doubanTop250.txt'pages = []proxies_list = []for i in range(0, 250, 25):ip_1 = "%s:3128" % str(i // 25)ip_2 = "%s:1080" % str(i // 25)douban_book = '?start=%s' % str(i)prox = {"http": ip_1,"https": ip_2,}pages.append(douban_book)proxies_list.append(prox)for page in pages:proxies = choice(proxies_list)spider(page, filename, proxies)pause(1)12345678910111213141516171819202122232425262728293031323334353637上述代码的IP代理池中的IP代理不可用(IP地址是瞎写的) , 所以代码不会成功运行 , 这里仅仅是为了展示一个完整的结构 。