示例网页用豆瓣电影top250。豆瓣top250其实是一个多页面的爬取,并没有什么可怕之处,首先做第一个页面的爬虫
from bs4 import BeautifulSoup
import requests
import time
url = 'https://movie.douban.com/top250?start=0&filter='
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')
imgs = soup.select('#content div.pic > a > img')
titles = soup.select('#content div.info > div.hd > a > span')
rates = soup.select('#content span.rating_num')
for img,title,rate in zip(imgs,titles,rates):
data = {
'img':img.get('src'),
'title':title.get_text(),
'rate':rate.get_text()
}
print(data)
OK,做完一个之后其实工作完成了大半,接下来稍微修改即可。
上面两张图是豆瓣top250第一页和第二页的链接,不难看出只有start后面的数字在发生改变,其实这个数字代表的就是每个页面的加载量,每页都会加载25个电影,找到这个规律后我们使用列表推导式完成多页面的集合,修改上面的url行如下。
urls = ['https://movie.douban.com/top250?start={}&filter='.format(str(i)) for i in range(0,250,25)]
之后将这些代码都封装进一个函数中,用for循环读出即可,最终代码如下。
from bs4 import BeautifulSoup
import requests
import time
urls = ['https://movie.douban.com/top250?start={}&filter='.format(str(i)) for i in range(0,250,25)]
def get_attractions(url,data=None):
wb_data = requests.get(url)
time.sleep(2)
soup = BeautifulSoup(wb_data.text,'lxml')
imgs = soup.select('#content div.pic > a > img')
titles = soup.select('#content div.info > div.hd > a > span')
rates = soup.select('#content span.rating_num')
if data == None:
for img,title,rate in zip(imgs,titles,rates):
data = {
'img':img.get('src'),
'title':title.get_text(),
'rate':rate.get_text()
}
print(data)
for single_url in urls:
get_attractions(single_url)
这里引入了python的time模块,使用它的sleep()方法来推迟调用线程的运行,这里用来让爬虫每隔两秒请求一次,可以防止有的网站因为频繁的请求把我们IP封掉。