您的位置:首页 > 编程语言 > Python开发

Python爬虫学习笔记-网页topN条目爬取

2017-01-10 08:56 471 查看

背景

爬取某网页TopN条目数据

过程

安装chrome驱动

注意,在安装过程中对于chrome驱动是有对应的版本要求的,否则运行时报错,比如下面的例子:

chrome的版本号:



而安装chrome的驱动后,并将其目录添加到系统path之后,运行报错如下:



从中可以看出,该错误是由于chrome的版本问题导致的。

根据网页页面上面的元素的位置,右键-检查可以查看对应的属性和值:



选择需要爬取的数据项,比如商品名,价格等等信息:



获取每件商品的名字:



代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
import time

browser = webdriver.Chrome()#用的是chrome的驱动器,这个驱动器是要安装到系统path中的。如果是无头浏览器的话,PhantomJS,则不会真实起一个浏览器
browser.set_page_load_timeout(30)#网页的等待超时
#有多少页商品
browser.get('http://www.17huo.com/search.html?sq=2&keyword=%E5%A4%A7%E8%A1%A3')
page_info = browser.find_element_by_css_selector('body > div.wrap > div.pagem.product_list_pager > div')
#body > div.wrap > div.pagem.product_list_pager > div,这个字符串是网页页面下,右键-检查-copy-copy selector
# print(page_info.text)

pages = int((page_info.text.split(',')[0]).split(' ')[1])#商品的页数,48页
print("page count is %s" %pages)
#根据商品的页数进行遍历,此时通过点击网页上的第二页可以看出,对应的url是原来基础上增加一个page=2,依次类推

for page in range(pages):
if page > 2:#只是抓取前3页
break
print('第%d页' % (page + 1))
url = 'http://www.17huo.com/?mod=search&sq=2&keyword=%E7%BE%8A%E6%AF%9B&page=' + str(page + 1)
browser.get(url)#打开该页
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")#发送js指令,模拟网页的滚动。(X坐标,Y坐标)
time.sleep(3)#需要等待滚动到底部,加载整个页面, 不然会load不完整
#抓取商品信息
#先看网页中第一件商品的位置。检查-发现该第一件商品刚好对应一个ul,所有商品都是该列表中的元素li.
#先抓取ul.copy-cpoy selector,如下
#body > div.wrap > div:nth-child(2) > div.p_main > ul
goods = browser.find_element_by_css_selector('body > div.wrap > div:nth-child(2) > div.p_main > ul').find_elements_by_tag_name('li')
#此时的goods是一个列表
print('%d页有%d件商品' % ((page + 1), len(goods)))
#遍历每个商品,获取商品信息,比如商品名字,
for good in goods:
try:
#获取商品的名字,获取结果如下:
#(第一件商品)body > div.wrap > div:nth-child(2) > div.p_main > ul > li:nth-child(1) > a:nth-child(1) > p:nth-child(2)
#(第二件商品)body > div.wrap > div:nth-child(2) > div.p_main > ul > li:nth-child(2) > a:nth-child(1) > p:nth-child(2)
#所以公有部分body > div.wrap > div:nth-child(2) > div.p_main > ul   都是已经通过good定位获取到的,所以只需要访问
title = good.find_element_by_css_selector('a:nth-child(1) > p:nth-child(2)').text
#此时good已经定位到了body > div.wrap > div:nth-child(2) > div.p_main > ul > li:nth-child(1),所以只需要定位后面的
#(第一件商品价格)body > div.wrap > div:nth-child(2) > div.p_main > ul > li:nth-child(1) > div > a > span
#(第二件商品价格)body > div.wrap > div:nth-child(2) > div.p_main > ul > li:nth-child(2) > div > a > span
price = good.find_element_by_css_selector('div > a > span').text
print(title, price)
except:
print(good.text)
#直接发http的方式的话,不会处理js的执行,所以对于动态网页,是有缺陷的。而采用selenium驱动则可以解决。
#python 开源代理池


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫