初学爬虫, 根据课程学习python爬虫,老规矩,先不管三七二十几,先敲了再说。
需求:
爬取图书的图片链接、图书的title信息、当前定价、评论数和评价星数共五部分信息。
分析:
打开当当,搜索python书籍,然后右键,检查网页元素,找到network,然后刷新整个页面,就会返回请求的页面数据,找到左边的红框内的请求链接,然后打开右边的response模块,检查下面返回的内容是否有我们需要的信息,发现没问题,就可以继续往下进行。
寻找图片:
把鼠标放在网页的图片上直接右键,然后点击检查,可以直接定位到网页源码的图片所在位置,如下图:
此时发现每一条<li ddt-pit******>...</li>内的信息都是一条图书信息
而里面的这个链接就是我们要找的第一条数据信息,图片的链接
此时便可先获取图片的链接
import requests
from pyquery import PyQuery
import csv
import time
# 找到浏览器的headers
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
}
base_url = 'https://search.dangdang.com/?key=python&act=input'
# 获取页面
res = requests.get(base_url,headers=headers)
# 解析页面
html = res.content.decode('GBK') # 获取页面返回信息后解码,一般使用utf-8,而此当当网使用的是GBK编码,在解码的时候我们就用GBK进行解码
doc = PyQuery(html)
book_ul = doc('#component_59 li').items() # 获取所有存放在li标签里的图书的信息,并存放在迭代器中
for one_li in book_ul:
#print(one_li)
# 获取图片链接,因为有的图片链接是放在src属性中,有的链接是放在data-original属性中,所以用一个if判断来选取
if one_li('.pic img').attr('data-original'):
img_url = one_li('.pic img').attr('data-original')
else:
img_url = one_li('.pic img').attr('src')
print(img_url)
# 标题
title = one_li('.name a').attr('title')
#print(title)
# 价格
price = one_li('.price .search_now_price').text()
#print(price)
# 获取评价数
comments = one_li('.search_star_line .search_comment_num').text()
#print(comments)
# 获取星数,本身网页中的星星数是对应的数值,所以我们需要进行一个转换
stars = float(one_li('.search_star_black span').attr('style').split(':')[-1].strip('%;'))/20
#print(stars)
输出图片链接如下:
同样道理,获取标题、定价、评价数、评价星数,同样在刚才的循环代码添加:
最后加入翻页,整理完整代码如下:
import requests
from pyquery import PyQuery
import csv
import time
class DDSpider(object):
def __init__(self,key):
self.key = key # 当前搜索的图书名,搜索关键词
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
}
self.base_url = 'https://search.dangdang.com/?key='+key+'&act=input&page_index={}'
# 获取界面
def get_pageInfo(self):
num_page = 0
while True:
num_page += 1
page_url = self.base_url.format(num_page)
res = requests.get(page_url,headers=self.headers)
# print(res.content.decode('GBK'))
# 解析
df = self.parse_pageInfo(res.content.decode('GBK'))
return df
time.sleep(1) # 为了防止请求过快,添加缓冲时间
if num_page == 1: # 当前设置为爬取1页数据
break
# 解析界面
def parse_pageInfo(self,html):
doc = PyQuery(html)
book_ul = doc('#component_59 li').items()
img_list = []
title_list = []
price_list = []
comments_list = []
stars_list = []
for one_li in book_ul:
# print(one_li)
# 获取图片链接
if one_li('.pic img').attr('data-original'):
img_url = one_li('.pic img').attr('data-original')
else:
img_url = one_li('.pic img').attr('src')
img_list.append('http:'+img_url)
# 标题
title = one_li('.name a').attr('title')
# print(title)
title_list.append(title)
# 价格
price = one_li('.price .search_now_price').text()
# print(price)
price_list.append(price)
# 获取评价数
comments = one_li('.search_star_line .search_comment_num').text()
# print(comments)
comments_list.append(comments)
# 获取星数
stars = float(one_li('.search_star_black span').attr('style').split(':')[-1].strip('%;'))/20
#stars = one_li('.search_star_black span').attr('style')
#print(stars)
stars_list.append(stars)
data = {'img':img_list,'title':title_list,'price':price_list,'comments':comments_list,'stars':stars_list}
return pd.DataFrame(data)
if __name__ == '__main__':
dd = DDSpider('python')
df = dd.get_pageInfo()
print(df)