爬虫小试-抓取JD图片

2017-10-03
2分钟阅读时长

因为项目需要, 要抓取京东一些图片, 来进行分析使用.如https://item.jd.com/bigimage.aspx?id=11921955

我们想抓取的就是这个图片右侧的8张图片. 进过分析这个系列html源码, 发现8张图片的地址在js数组中.

curl https://item.jd.com/bigimage.aspx?id=11921955

如果利用常规的requests + BeautifulSoup的话, 感觉只获取这个js数组就是一个挺麻烦的事情. 因为直接使用requests获取到的页面, 没有动态加载js数据.

幸好, 有相应的解决方案

  1. requests + Pyv8 + BeautifulSoup
  2. Selenium

第一种方式没优势, 我没有试, 网上对这个得评价不是很好. 所以我没有用

我尝试的是第二种方式 — Selenium-Python中文文档

一. 安装Selenium

两种方式:
1. Python3.5: pip install selenium
2. python2.x: easy_install selenium

二. 验证是否安装成功

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://item.jd.com/bigimage.aspx?id=11921955")
print driver.page_source

三. 抓取图片

如果安装成功的话, 执行上面的程序你会发现,js数组已经动态加载成功.

利用下面的代码即可获取到这些图片

ul = driver.find_element_by_class_name('list-h')
lis = ul.find_elements_by_tag_name("li")

for li in lis:
        image = li.find_element_by_tag_name("img")
        img_src = image.get_attribute("src")

遇到的问题: 问题1:Message: geckodriver executable needs to be in PATH

这是由于缺少geckodriver这个文件去mozilla/geckodriver下载相应的文件, 放入系统的执行目录下即可, 如/usr/bin

问题2:Message: Unable to find a matching set of capabilities

这是由于geckodriver版本不兼容的问题造成的. 在mozilla/geckodriver选择合适的版本.

问题3: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line

这是由于无法找到firefox的驱动导致的. 安装相关的驱动即可 selenium驱动

四. 如何在无界面的情况下运行selenium

有两种方式:

方式1:

使用Xvfb虚拟X窗口, 不会把图像输出到屏幕上,也就是说,就算你的电脑沒有启动 Xwindow , 你仍然可以执行任何图形程序, 相关用法参见 Linux 无界面使用 selenium

yum install xorg-x11-server-Xvfb

# 安装 firefox 和 selenium
yum install firefox
pip install selenium

# 运行 Xvfb
Xvfb :0 -screen 0 800x600x24 >> /tmp/Xvfb.out 2>&1 &
export DISPLAY=:0
方式2

但是我觉得方式1不是优雅的解决办法. 看到stackoverflow上推荐使用phantomjs

#centos 安装phantomjs
sudo yum install gcc gcc-c++ make git openssl-devel freetype-devel fontconfig-devel 

wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2

mv phantomjs-2.1.1-linux-x86_64 /usr/local

ln -sf /usr/local/phantomjs-2.1.1-linux-x86_64/bin/phantomjs

/usr/local/phantomjs

phantomjs -v

相应的,

driver = webdriver.webdriver.PhantomJS()

更好的工程化:

if os.getenv("environment") == "production":
    driver = webdriver.PhantomJS()
else:
    driver = webdriver.Firefox()

详细代码请查看我的georgehao/wheel

参考资料:

  1. http://tmq.qq.com/2017/04/find/
  2. http://selenium-python-zh.readthedocs.io/en/latest/getting-started.html
  3. https://stackoverflow.com/questions/40208051/selenium-using-python-geckodriver-executable-needs-to-be-in-path
  4. http://cuiqingcai.com/2599.html
  5. https://stackoverflow.com/questions/7593611/selenium-testing-without-browser