当前位置: 首页 > news >正文

scrapy 学习笔记

 

 

1、scrapy 配合 selenium、phantomJS 抓取动态页面, 单纯的selemium 加 Firefox浏览器就可以抓取动态页面了,

但开启窗口太耗资源,而且一般服务器的linux 没有视窗系统,所以通过无窗口的phantomJS就行了,原理都是通过webket加载js渲染。

直接 pip install selenium 安装 selenium,下载 phantomJS 解压,并将 phantomJS.exe 加入到系统环境,然后就大功告成了。

 

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from scrapy.selector import Selector
import time
import os

def writeFile(dirPath, page):
    data = Selector(text = page).xpath("//td[@class='zwmc']/div/a")
    titles = data.xpath('string(.)').extract()
    timeMarks = Selector(text = browser.page_source).xpath("//td[@class='gxsj']/span/text()").extract()
    links = Selector(text = browser.page_source).xpath("//td[@class='zwmc']/div/a/@href").extract()

    for i in range(len(titles)):
        fileName = titles[i].replace(':', '-').replace('/', '-').replace('\\', '-').replace('*', 'x').replace('|', '-').replace('?', '-').replace('<', '-').replace('>', '-').replace('"', '-').replace('\n', '-').replace('\t', '-')
        filePath = dirPath + os.sep + fileName + '.txt'

        with open(filePath, 'w') as fp:
            fp.write(titles[i])
            fp.write('$***$')
            fp.write(timeMarks[i])
            fp.write('$***$')
            fp.write(links[i])


def searchFunction(browser, url, keyWord, dirPath):
    browser.get(url)

#勾选城市
    browser.find_element_by_xpath("//input[@id='buttonSelCity']").click()
    browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[1]/td/label/input[@iname='北京']").click()
    browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[1]/td/label/input[@iname='上海']").click()
    browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[3]/td/label/input[@iname='南京']").click()
    browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[4]/td/label/input[@iname='苏州']").click()
    browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[4]/td/label/input[@iname='无锡']").click()
    browser.find_element_by_xpath("//div[@class='sPopupTitle250']/div/a[1]").click()

#定位搜索框
    searchBox = browser.find_element_by_xpath("//div[@class='keyword']/input[@type='text']")

#发送搜索内容 
    searchBox.send_keys(keyWord)

#确认搜索   
    browser.find_element_by_xpath("//div[@class='btn']/button[@class='doSearch']").click()

    totalCount = Selector(text = browser.page_source).xpath("//span[@class='search_yx_tj']/em/text()").extract()[0]
    pageOver = int(totalCount) / 40
    for i in range(pageOver):
        time.sleep(3)
        writeFile(dirPath, browser.page_source)
        browser.find_element_by_link_text("下一页").click()    

    time.sleep(3)
    writeFile(dirPath, browser.page_source) 


if __name__ == '__main__':
    print 'START'
    url = 'http://www.zhaopin.com/'
    keyWord = u"华为技术有限公司"
    dirPath = keyWord + u"招聘信息"

    if not os.path.exists(dirPath):
        os.makedirs(dirPath)

#定义一个火狐浏览器对象
    # browser = webdriver.Firefox()
    browser = webdriver.PhantomJS()
    searchFunction(browser, url, keyWord, dirPath)

    # browser.close()
    browser.quit()
    print 'END'

 

 

 

 

 

 

参考资料:

1、python+selenium+scrapy搭建简单爬虫  http://blog.csdn.net/treasure_z/article/details/51064493

2、数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 http://blog.chinaunix.net/uid-22414998-id-3692113.html

3、scrapy 和selenium如何连接起来 https://segmentfault.com/q/1010000002958344

 

转载于:https://www.cnblogs.com/xunux/p/5907406.html

相关文章:

  • 关于 jquery 选择器的 深入理解 -1
  • c++ vector 用法
  • LD_LIBRARY_PATH的设定
  • 关于分布式事务
  • Oracle update 日期
  • some useful linux commands
  • Oracle RacOneNode 修改 cluster name步骤
  • 论文笔记之:A CNN Cascade for Landmark Guided Semantic Part Segmentation
  • C#文件相同性判断
  • Struts2日期类型转换
  • 新建一个文章
  • MySql(三): 覆盖索引( Covering Index )
  • Shell脚本编程30分钟入门
  • 【转】浅谈JavaScript、ES5、ES6
  • 股票操作指南
  • classpath对获取配置文件的影响
  • Docker: 容器互访的三种方式
  • ES6 ...操作符
  • exports和module.exports
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • mysql常用命令汇总
  • Swift 中的尾递归和蹦床
  • Vue UI框架库开发介绍
  • Vue官网教程学习过程中值得记录的一些事情
  • 分类模型——Logistics Regression
  • 关于Java中分层中遇到的一些问题
  • 欢迎参加第二届中国游戏开发者大会
  • 基于遗传算法的优化问题求解
  • 前端之Sass/Scss实战笔记
  • 使用 Docker 部署 Spring Boot项目
  • 数据科学 第 3 章 11 字符串处理
  • 听说你叫Java(二)–Servlet请求
  • 我的zsh配置, 2019最新方案
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​比特币大跌的 2 个原因
  • #LLM入门|Prompt#3.3_存储_Memory
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (编译到47%失败)to be deleted
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (一)Java算法:二分查找
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)IOS中获取各种文件的目录路径的方法
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @ModelAttribute使用详解
  • @WebServiceClient注解,wsdlLocation 可配置
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [BJDCTF2020]The mystery of ip1
  • [BZOJ3757] 苹果树
  • [C++] new和delete
  • [C++]二叉搜索树
  • [cb]UIGrid+UIStretch的自适应
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理