2017.07.28 Python网络爬虫之爬虫实战 今日影视2 获取JS加载的数据

1.动态网页指几种可能:

1)需要用户交互,如常见的登录操作;

2)网页通过js / AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<divid="test"><span>aaa</span></div>;

3)点击输入关键字后进行查询,而浏览器url地址不变

2.想用Python获取网站中JavaScript返回的数据,目前有两种方法:

第一种方法:直接url法

(1)认真分析页面结构,查看js响应的动作;

(2)借助于firfox的firebug分析js点击动作所发出的请求url;

(3)将此异步请求的url作为scrapy的start_url或yield request再次进行抓取。

第二种方法:借助于selenium

Selenium基于JavaScript 并结合其WebDriver来模拟用户的真实操作,它有很好的处理Ajax的能力,并且支持多种浏览器(Safari,IE,Firefox,Chrome),可以运行在多种操作系统上面,Selenium可以调用浏览器的API接口,selenium 会打开一个浏览器,然后在新打开的浏览器中执行程序中模拟的动作。

如图:

3.下面安装Selenium模块:

4.浏览器的选择:在编写Python网络爬虫时,主要用到Selenium的Webdriver,Selenium.Webdriver不可能支持所有浏览器,也没必要支持所有浏览器。

Webdriver支持列表:

5.安装PhantomJS:

下载解压后,和python放到一个文件夹:

windows下的PhantomJS环境配置好后,测试成功:

6.Selenium&PhantomJS抓取数据:

(1)网站获取返回数据

(2)定位“有效数据”的位置

(3)从定位中获取“有效数据”

7.以百度搜索为例,使用百度搜索“python selenium”,并保存第一页搜索结果的标题和链接:

(1)获取搜索结果:直接用Selenium&PhantomJS打开百度首页,然后模拟搜索关键字

(2)定位表单框架或“有效数据”位置,可以用import导入bs4来完成,也可以用Selenium本身自带的函数完成:总共有8中F方法从返回数据中定位“有效数据”:

可以看出文本框里有class,name,id属性,可以使用find_element_by_class_name,find_element_by_id,find_element_by_name来定位:

下边三个定位函数任意选择一个:

textElement=browser.find_element_by_class_name(‘s_ipt‘)

textElement=browser.find_element_by_id(‘kw‘)

textElement=browser.find_element_by_name(‘wd‘)

发送搜索关键字:

textElement.send_keys(‘python selenium‘)

定位提交按钮:

从图中可以看出,submit按键有id,class属性,可以用find_element_by_class_name和find_element_by_id定位:

8.获取有效数据的位置:先定位搜索结果的标题和链接:查看搜索结果的源码:

发现一个特殊属性:class="c-tools",搜索这个属性:

发现一共12条,并且第二条搜索结果的标题和搜索页面中的第二个搜索结果相同,可以确定所有的搜索结果中都包含class="c-tools"标签

可以用find_element_by_class_name定位所有搜索结果了:

9.从位置中获取有效数据:有效数据的位置确定后,如何从位置中过滤出有效的数据呢?

Selenium有自己独特的方法:

element.text()

element.get_attribute(name)

所需的有效数据就是data-tools属性的值:执行命令

遍历resultElements列表,可以获取所有搜索结果的title和url。

时间: 2024-10-02 21:58:44

2017.07.28 Python网络爬虫之爬虫实战 今日影视2 获取JS加载的数据的相关文章

2017.07.24 Python网络爬虫之urllib2修改Header

1.urllib2修改header: (1)在使用网络爬虫时,有一些站点不喜欢被程序访问(非人为访问),会检查连接者的"身份证":默认情况下,urllib2把自己的版本号Python-urllib2/x.y作为自己的"身份证号码"来通过检查,这个身份证号码可能会让站点有点迷惑,或者干脆不工作 (2)这时可以让python程序冒充浏览器访问网站,网站是通过浏览器发送过来的User-Agent的值来确认浏览器身份的,用urllib2创建一个请求对象,并给它一个包含头数据

2017.07.22 Python网络爬虫之简单的Python脚本

1.九九乘法表: # !usr/bin/env python# -*- coding:utf-8 -*- class PrintTable(object): """打印九九乘法表""" def __init__(self): print(u"开始打印9x9乘法表格") self.print99() def print99(self): for i in xrange(1,10): for j in xrange(1,i+1):

2017.07.19 Python网络爬虫之Python语句

1.if else 语句:非此即彼 if 判断条件1: 执行语句1 elif 判断条件2: 执行语句2 elif 判断条件3: 执行语句3 else: 执行语句4 编写一个testIfRamainder7.py 熟悉一下if语句: # !usr/bin/env python# -*- coding:utf-8 -*- def isEvenNum(num): if num%7==0: print(u"%d 可以被7整除" %num) else: print(u"%d 不可以被7

2017.07.17 Python网络爬虫之Python基础1

1.Python变量类型: (1)数字 int类型:有符号整数,就是C语言中所指的整型,也就是数学中的整数,它的大小与安装的解释器的位数有关 查看当前系统下的Int最大值: 与C语言不同,Python给变量赋值时不需要预先声明变量类型,也就是说在给变量赋值时小于2147483647的数字默认认为是int类型,超过了则自动为Long类型 另外,八进制数字,十六进制数字都属于int(Long)类型的 Long类型:长整型,超过int类型的整数默认转换为Long,一般来说int足够用了,只要内存足够大

2017.07.26 Python网络爬虫之Scrapy爬虫框架

1.windows下安装scrapy:cmd命令行下:cd到python的scripts目录,然后运行pip install 命令 然后pycharmIDE下就有了Scrapy: 在cmd下运行scrapy命令,出错!!!: 解决方法: 在Python的Lib\site-packages文件夹下新建一个sitecustomize.py: import sys sys.setdefaultencoding('gb2312') 再次在cmd下运行scrapy,成功: 2.Scrapy选择器和XPat

2017.07.09 Python网络编程之重用套接字地址

1.重用套接字地址: # -*- coding: UTF-8 -*-# 如果在某个端口上运行一个Python套接字服务器,连接一次后便终止了运行,就不能在使用这个端口了# !usr/bin/env python# Python Network Programming Cookbook --Chapter -1# This program is optimized for Python 2.7# It may run on any other version with/without modifi

2017.07.12 Python网络编程之使用多路复用套接字I/O

1.在本章开始之前,需要先理解同步与异步,阻塞与非阻塞的区别: "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话

2017.07.16 Python网络编程之在套接字服务器中使用ThreadingMixIn

直接上代码,之后再解释: # -*- coding: UTF-8 -*-# 或许基于某些原因你不想编写基于进程的应用程序,而更愿意编写多线程应用程序# 和之前的基于ForkingMixIn的套接字服务器一样,使用ThreadingMixIn编写的套接字服务器要遵循相同的回显服务器编程模式# ThreadedServr继承自TCPServer和ThreadingMixIn,客户端连接这个多线程版服务器时,会创建一个新线程# !usr/bin/env python# Python Network P

python爬虫 selenium 抓取 今日头条(ajax异步加载)

from selenium import webdriver from lxml import etree from pyquery import PyQuery as pq import time driver = webdriver.Chrome() driver.maximize_window() driver.get('https://www.toutiao.com/') driver.implicitly_wait(10) driver.find_element_by_link_tex