python爬虫之利用pyquery爬取当当网图书信息

初学爬虫, 根据课程学习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)

  • 9
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旋转小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值