scrapy--selenium(二)

Posted on 2018-10-11 15:21  eilinge  阅读(332)  评论(0编辑  收藏  举报

  今天学习了很多,还是想给大家讲一讲正题:scrapy的动态加载AJax的网页爬取:selenium。让我们开始

三: 针对大型电商网站:京东网,因为比较有代表性,爬出来有点小成就。先给大家看下效果图。好让大家有点动力QAQ

一: 查看一下京东网加载商品的原理

1.1:将该网页加载的所有商品信息放入<li class="seckill_mod_goods">...</li>

1.2:获取网页源码,可以清楚的知道--无法在源码中找到商品信息所在的<li>...</li>标签

1.3: 那么现在问题来了,这些商品信息是从哪里加载出来的呢?那就是这次要将的Ajax动态加载信息,可以打开网页的审查元素,点击network,f5刷新,可以找到script类型的脚本

就是上图用红线画出来的script文件,查看中有[0..499]500个商品信息

二: 了解了基本原理,再来看看源代码,就能很容易知道原理了__selenimu.py

#-*- coding:utf-8 -*-
import time
from selenium import webdriver
import pdb
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys    import Keys
from lxml import etree
import re
from bs4 import BeautifulSoup

chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)

# 请求京东页面
driver.get(
    "https://miaosha.jd.com/category.html?cate_id=19")
time.sleep(3)

img_list = []
# 逐渐滚动浏览器窗口,令ajax逐渐加载

for i in range(1,200):
    js = ("var q=document.documentElement.scrollTop=" + str(300 * i))  # 谷歌 和 火狐
    driver.execute_script(js)
    time.sleep(0.3)

# 拿到页面源码
html = etree.HTML(driver.page_source)
all_img_list = []

# 得到所有图片
img_group_list = html.xpath("//*[@class='seckill_mod_goods_link_img']/@src")

# 收集所有图片链接到列表

for img_group in img_group_list:
    img_of_group = re.findall(r'.*q70\.jpg$',img_group)
    all_img_list.append(img_of_group)

with open('vip.txt', 'w') as f:
    #pdb.set_trace()
    for img_list_item in all_img_list:
        if img_list_item[0]:
            f.write(img_list_item[0]+'\n')
        else:
            driver.quit()
# 退出浏览器
driver.quit()