赞
踩
初学爬虫, 根据课程学习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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。