|
闲来无事扒个网页解闷
首先找个软柿子捏
亚马逊热销排行榜对爬虫的限制并不多
页面连ajx请求都不用发,更没用JS渲染,
只要有网址直接get出所有的数据
用的关于获取网页资源,只用到requests库
首先还是要先来看一下网页
每个爬虫新手遇到这样一个如此坦荡的网页,
都会觉得在JS横行的时代,这么天真朴素的网页真是出淤泥而不不染
首先谈思路
主页的链接是写死在代码里的,
解析第一页的时候,第一页的结尾会出现后面的页码和下一页,
首先遵循空间顺序解析出当前页的图书信息,然后找出下一页那个按钮对应的链接,
获取下一页的内容,重复上一步的动作
直到无下一页,获取亚马逊页面结束
然后从页面中获取书籍信息什么的都比较简单
开始上代码
import requests, gevent, random, time
from bs4 import BeautifulSoup
from gevent import monkey
monkey.patch_all()
用request库获取页面
协程处理多任务
用soup解析页面
打补丁
def __init__(self):
self.url = "https://www.amazon.cn/gp/bestsellers/books/ref=sv_b_3#1"
self.tasks_list = []
self.index = 1
self.handle_page()
实例初始化实现的功能都写在注释里了,这个类不能代码复用,所以在init里没写传参功能
def get_page(self,url):
"""输入链接返回resopnse.text
不设防网页,简单构造请求头即可"""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
}
try:
html = requests.get(url, headers=headers).text
return html
except Exception as e:
print(e)
return None
就是给requests的get方法加了个请求头,多个打印异常功能
不过返回的是resopnse.text不是response
def handle_page(self):
"""解析当前页面"""
html = self.get_page(self.url)
if not html:
gevent.joinall(self.tasks_list)
soup = BeautifulSoup(html, "lxml")
li_list = soup.select('li[class="zg-item-immersion"]')
for li in li_list:
img_url = li.select('img')[0].attrs['src']
book = li.select('img')[0].attrs['alt']
book = book.replace(":", "")
author = li.select('span[class="a-size-small a-color-base"]')[0].get_text()
path = "F:\A_code\Spider\Amazon\亚马逊热销前100/"+"%s" \
"%s" \
"NO.%d.jpg"%(book, author, self.index)
self.tasks_list.append(gevent.spawn(self.down_img, img_url, path))
self.index += 1
a_last = soup.select('li[class="a-last"]')
if a_last:
a_href = a_last[0].select('a')[0].attrs['href']
self.url = a_href
self.handle_page()
else:
gevent.joinall(self.tasks_list)
**爬虫的主要功能在这个方法里
这个方法的逻辑是**
- 解析页面,获取当前页排行榜中的图书信息
- 图书信息包括,书名,作者,图片链接
- 根据书名作者,构建每个图书的写入路径
- 把链接与路径传入下载函数中
- 解析是否有下一页
- 存在下一页,改变self.url调用自身
- 不存在,认为已获取全部资源,joinall
- 若下一页获取失败,认为以获取全部资源,joinall
@staticmethod
def down_img(img_url, path):
"""下载图片进本地"""
time.sleep(random.randint(1, 2))
img = requests.get(img_url).content
with open(path, "wb")as f:
f.write(img)
一个简单的爬取类就写完了
amazon = Amazon_books()
最后,上一张爬取结果

代码我都是按顺序贴的,我就不再贴重贴完整代码了
欢迎大家一起讨论 |