当前位置:   article > 正文

python爬虫之利用pyquery爬取当当网图书信息_爬取当当网站图书数据

爬取当当网站图书数据

初学爬虫, 根据课程学习python爬虫,老规矩,先不管三七二十几,先敲了再说。

需求:

爬取图书的图片链接、图书的title信息、当前定价、评论数和评价星数共五部分信息。

 分析:

打开当当,搜索python书籍,然后右键,检查网页元素,找到network,然后刷新整个页面,就会返回请求的页面数据,找到左边的红框内的请求链接,然后打开右边的response模块,检查下面返回的内容是否有我们需要的信息,发现没问题,就可以继续往下进行。

 寻找图片: 

把鼠标放在网页的图片上直接右键,然后点击检查,可以直接定位到网页源码的图片所在位置,如下图:

 此时发现每一条<li ddt-pit******>...</li>内的信息都是一条图书信息

而里面的这个链接就是我们要找的第一条数据信息,图片的链接

 此时便可先获取图片的链接

  1. import requests
  2. from pyquery import PyQuery
  3. import csv
  4. import time
  5. # 找到浏览器的headers
  6. headers = {
  7. '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'
  8. }
  9. base_url = 'https://search.dangdang.com/?key=python&act=input'
  10. # 获取页面
  11. res = requests.get(base_url,headers=headers)
  12. # 解析页面
  13. html = res.content.decode('GBK') # 获取页面返回信息后解码,一般使用utf-8,而此当当网使用的是GBK编码,在解码的时候我们就用GBK进行解码
  14. doc = PyQuery(html)
  15. book_ul = doc('#component_59 li').items() # 获取所有存放在li标签里的图书的信息,并存放在迭代器中
  16. for one_li in book_ul:
  17. #print(one_li)
  18. # 获取图片链接,因为有的图片链接是放在src属性中,有的链接是放在data-original属性中,所以用一个if判断来选取
  19. if one_li('.pic img').attr('data-original'):
  20. img_url = one_li('.pic img').attr('data-original')
  21. else:
  22. img_url = one_li('.pic img').attr('src')
  23. print(img_url)
  24. # 标题
  25. title = one_li('.name a').attr('title')
  26. #print(title)
  27. # 价格
  28. price = one_li('.price .search_now_price').text()
  29. #print(price)
  30. # 获取评价数
  31. comments = one_li('.search_star_line .search_comment_num').text()
  32. #print(comments)
  33. # 获取星数,本身网页中的星星数是对应的数值,所以我们需要进行一个转换
  34. stars = float(one_li('.search_star_black span').attr('style').split(':')[-1].strip('%;'))/20
  35. #print(stars)

 输出图片链接如下:

同样道理,获取标题、定价、评价数、评价星数,同样在刚才的循环代码添加:

 最后加入翻页,整理完整代码如下:

  1. import requests
  2. from pyquery import PyQuery
  3. import csv
  4. import time
  5. class DDSpider(object):
  6. def __init__(self,key):
  7. self.key = key # 当前搜索的图书名,搜索关键词
  8. self.headers = {
  9. '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'
  10. }
  11. self.base_url = 'https://search.dangdang.com/?key='+key+'&act=input&page_index={}'
  12. # 获取界面
  13. def get_pageInfo(self):
  14. num_page = 0
  15. while True:
  16. num_page += 1
  17. page_url = self.base_url.format(num_page)
  18. res = requests.get(page_url,headers=self.headers)
  19. # print(res.content.decode('GBK'))
  20. # 解析
  21. df = self.parse_pageInfo(res.content.decode('GBK'))
  22. return df
  23. time.sleep(1) # 为了防止请求过快,添加缓冲时间
  24. if num_page == 1: # 当前设置为爬取1页数据
  25. break
  26. # 解析界面
  27. def parse_pageInfo(self,html):
  28. doc = PyQuery(html)
  29. book_ul = doc('#component_59 li').items()
  30. img_list = []
  31. title_list = []
  32. price_list = []
  33. comments_list = []
  34. stars_list = []
  35. for one_li in book_ul:
  36. # print(one_li)
  37. # 获取图片链接
  38. if one_li('.pic img').attr('data-original'):
  39. img_url = one_li('.pic img').attr('data-original')
  40. else:
  41. img_url = one_li('.pic img').attr('src')
  42. img_list.append('http:'+img_url)
  43. # 标题
  44. title = one_li('.name a').attr('title')
  45. # print(title)
  46. title_list.append(title)
  47. # 价格
  48. price = one_li('.price .search_now_price').text()
  49. # print(price)
  50. price_list.append(price)
  51. # 获取评价数
  52. comments = one_li('.search_star_line .search_comment_num').text()
  53. # print(comments)
  54. comments_list.append(comments)
  55. # 获取星数
  56. stars = float(one_li('.search_star_black span').attr('style').split(':')[-1].strip('%;'))/20
  57. #stars = one_li('.search_star_black span').attr('style')
  58. #print(stars)
  59. stars_list.append(stars)
  60. data = {'img':img_list,'title':title_list,'price':price_list,'comments':comments_list,'stars':stars_list}
  61. return pd.DataFrame(data)
  62. if __name__ == '__main__':
  63. dd = DDSpider('python')
  64. df = dd.get_pageInfo()
  65. print(df)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/825080
推荐阅读
相关标签
  

闽ICP备14008679号