c爬虫抓取网页数据(一下如何用Python来爬取京东商品(一)_)

优采云 发布时间: 2021-12-28 11:14

  c爬虫抓取网页数据(一下如何用Python来爬取京东商品(一)_)

  大家好,我是归零~

  今天,我将介绍如何使用Python抓取京东产品类别。数据包括产品名称、价格、出版商、作者等信息。

  

  本次爬虫使用的核心库是Selenium+pyquery,Selenium用于驱动浏览器模拟访问网页,pyquery用于解析页面信息进行数据提取。让我们来看看最终的结果。

  

  脚本启动后,Selenium 会自动打开京东网页,翻到商品页面信息。当浏览器翻页时,它控制后台返回提取的数据。

  在介绍主程序之前,这里先介绍一下Selenium包

  硒安装

  Selenium 主要用作 Web 应用程序的测试工具。可以控制浏览器完成一系列步骤,模拟人的操作;比如自动刷新课程、自动填文、自动查询web端快递单号等都可以。目前,它支持 Java 和 Python。、C#、Ruby等语言;

  

  在做网页爬虫的时候,有些网页的数据是以ajax的方式渲染的,比如微博。标题没有下一页条目。通过刷新页面实现翻页效果;这种类型的网页数据不是直接放在html中的。是通过用户操作触发嵌入在html中的js命令,从而调用json文件中存储的数据,最后呈现;

  对于这类网页采集

,一般有两种思路:

  所以Selenium工具可以对web端的一些反爬措施实现一些有效的抑制;

  Python使用Selenium时,可以使用打包好的Selenium库,使用pip命令完成安装。

  pip install selenium

  Selenium 目前支持的浏览器包括 Chrome 和 Firefox。建议大家选择Chrome比较好,因为网上关于Chrome的文档比较多。

  但是在使用之前,除了确保安装了Chrome浏览器之外,还需要确保chromedriver.exe工具(Selenium的核心是webdriver,chromedriver.exe是Chrome的WebDriver工具)也安装了

  chromedriver的版本需要与Chrome浏览器的版本对应,本地下载即可

  

  下载地址如下:

  2.爬虫逻辑

  使用Selenium模拟人工操作抓取京东数据,需要按顺序执行以下步骤(这里以抓取Python图书产品为例):

  

  首先需要初始化创建webdriver的Chrome浏览器和数据存储文件(这里我用的是txt文件)

  def __init__(self,item_name,txt_path):

url = \'https://www.jd.com/\' # 登录网址

self.url = url

self.item_name = item_name

self.txt_file = open(txt_path,encoding=\'utf-8\',mode=\'w+\')

options = webdriver.ChromeOptions() # 谷歌选项

# 设置为开发者模式,避免被识别

options.add_experimental_option(\'excludeSwitches\',

[\'enable-automation\'])

self.browser = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",

options = options)

self.wait = WebDriverWait(self.browser,2)

  webdriver.Chrome()方法用于创建驱动浏览器Chrome,并将之前下载到本地的chromedriver.exe文件夹的路径赋值给executable_path参数。

  浏览器打开网页时,可能会因为网速原因加载缓慢,所以这里我们使用WebDriverWait方法创建了一个wait方法,每次调用浏览器都需要等待2秒才能继续下一步;

  初步操作后,接下来就是主程序,模拟访问、输入、点击等操作;我将所有这些操作封装在一个 run() 函数中,

   def run(self):

"""登陆接口"""

self.browser.get(self.url)

input_edit = self.browser.find_element(By.CSS_SELECTOR,\'#key\')

input_edit.clear()

input_edit.send_keys(self.item_name)

search_button = self.browser.find_element(By.CSS_SELECTOR,\'#search > div > div.form > button\')

search_button.click()# 点击

time.sleep(2)

html = self.browser.page_source # 获取 html

self.parse_html(html)

current_url = self.browser.current_url # 获取当前页面 url

initial_url = str(current_url).split(\'&pvid\')[0]

for i in range(1,100):

try:

print(\'正在解析----------------{}图片\'.format(str(i)))

next_page_url = initial_url + \'&page={}&s={}&click=0\'.format(str(i*2+1),str(i*60+1))

print(next_page_url)

self.browser.get(next_page_url)

self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,\'#J_goodsList > ul > li\')))

html = self.browser.page_source

self.parse_html(html)# 对 html 网址进行解析

time.sleep(2) # 设置频率

except Exception as e:

print(\'Error Next page\',e)

self.txt_file.close()# 关闭 txt 文件

  首先使用get()方法访问京东主页,然后定位到页面上的搜索栏和搜索按钮标签input_edit和search_button;完成输入并点击操作

  关于网页元素标签的定位,如果不能,可以使用浏览器开发者模式,分为以下几个步骤(这里以CSS_Selector为例):

  

  在翻页操作中,这里是按照京东url规则构造的,

  第 5 页

  https://search.jd.com/Search?keyword=%E4%BB%A3%E6%A3%AE%E9%93%B5&qrst=1&suggest=7.def.0.base&wq=%E4%BB%A3%E6%A3%AE%E9%93%B5&stock=1&page=9&s=241&click=0

  第 6 页

  https://search.jd.com/Search?keyword=%E4%BB%A3%E6%A3%AE%E9%93%B5&qrst=1&suggest=7.def.0.base&wq=%E4%BB%A3%E6%A3%AE%E9%93%B5&stock=1&page=11&s=301&click=0

  如果仔细看,你会发现第5页和第6页的urls唯一的区别就是两个参数page和s;

  按照这个规则,通过改变page和s参数来构造京东商品的前100页商品信息,完成数据抓取;

  关于数据提取部分,我使用parse_html函数来完成

  

  为了提高程序的友好性,我把所有的功能都封装在一个类中,用户只需要输入两个参数,一个是需要采集的产品名称,一个是存储的路径文件; 可以完成数据爬取;

  

  最后将抓取到的数据保存成txt文件,结果如下

  

  4. 总结

  selenium虽然可以有效破解web端的一些反爬虫机制,但是对于一些网站,比如拉勾网,就没什么用了。在拉勾官网使用Selenium驱动浏览器模拟翻页操作时,网站可以识别非人类。操作,暂时禁止并警告您的IP;

  本文涉及的完整源码,关注微信公众号:程序员大飞,回复后台关键词:京东货,即可获取!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线