Python如何爬取有随机数生成器参数的Ajax地址

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
比如下面这个网站:
筛选了2013年发表的论文。
1.第一页只显示了20篇,总共有1132539篇
2.我点击next后,网页显示的是第二页的内容。这时url会变成
3.再点击next,显示第三页的内容,这时url还是
而如果你复制这个地址:,浏览器并不会跳到第2/3/4...页。
我咨询了一个同学,他说这是用ajax处理的,但具体如何爬取剩下的内容他也不知道。
那么如何爬取所有的内容?(当然第一页的内容很简单,我已经爬取出来了)
先谢谢各位了。
ps:我使用的是beautifulsoup+requests
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
beautifulsoup只能获得静态html,不能模拟界面操作。
你的需求,可以用selenium webdriver来实现。selenium webdriver可以模拟浏览器操作,比如你的需求,只要用webdriver的接口,找到下一页按钮的DOM节点,给它发送点击事件,就可以了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
直接对ajax的api爬数据就好了,你所说的爬的url,只是从用户角度来模拟的
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你可以用nodejs先渲染页面,然后再进行解析渲染的页面。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我看了你提供的网站
发现点击分页他会向
发送一个post请求
form 参数如下
p$l:AjaxServer
portlets:id=relevancesortad:sort=;id=timelinead:blobid=NCID_1_.14.18.34_985_MetA0_S_MegaStore_F_1:yr=:term=(%%5BDate%20-%20Publication%5D%20%3A%20%%5BDate%20-%20Publication%5D);id=pmcommonsad:page=id=reldata:db=pubmed:querykey=1;id=id=recentactivity
ncbi_phid:DA1BD2DE6E2
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
直接用开发者工具看浏览器发送的请求
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
上面几位提到的直接查看发起的请求,然后分析请求的规律,猜出请求的接口是如何设计的,这样的话,比爬取HTML页面更快,但是有一个问题,就是有可能人家接口的调用方式你不一定能完全猜测出来,为了更高的成功率(对于我的业务来讲,速度不是最主要的,虽然他也很重要),我使用过两种方式,可以爬取几乎任何网站任何形式的内容。
基于开源的Chrome浏览器 + 定制的插件 + 服务器端控制程序。我的需求是需要让一个用户输入自己在某网站上面的用户名、密码,登录的时候还需要输入图片验证码或者输入手机验证码,对于我这种需求,不可能简单的使用爬取。所以,解决方法就用到的浏览器。
Chrome 浏览器用来成为我整个爬取的底层技术,我的插件则用来控制浏览器,服务器端发起一次爬取请求,插件收到之后,使用Chrome打开网页,然后直接抓取网页上面的验证码图片,如果我判断出网站是要求手机验证的,那么就直接点击一下发送验证码(插件直接发起一次点击事情),这个时候,服务器端则通知用户端输入(若是图片验证码,客户端也会直接显示出来),然后提交,插件将用户提交的数据填写到打开的网页中,点击提交。
因为网页就是浏览器打开的,所以,爬取任何数据都不是问题了。
使用 Chromium OS,直接安装至服务器上面,我用的直接是二次开发 Chromium OS 系统,这样更难,全是效率和稳定性更高,现在还未完成。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容 - 华天清 - 博客园
随笔 - 33, 文章 - 0, 评论 - 10, 引用 - 0
1,引言在一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第二部分,第一部分实验了用xslt方式一次性。留下了一个问题:javascript管理的动态内容怎样提取?那么本文就回答这个问题。2,提取动态内容的技术部件在上一篇中,要提取的内容是直接从网页的source code里拿到的。但是一些Ajax动态内容是在source code找不到的,就要找合适的程序库把异步或动态加载的内容加载上来,交给本项目的提取器进行提取。python可以使用执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。selenium自己不带浏览器,可以使用第三方浏览器如Firefox,Chrome等,也可以使用headless浏览器如在后台执行。
3,源代码和实验过程
假如我们要抓取的手机名称和价格(价格在网页源码是找不到的),如下图:
第一步:利用集搜客谋数台的直观标注功能,可以极快速度自动生成一个调试好的抓取规则,其实是一个标准的xslt程序,如下图,把生成的xslt程序拷贝到下面的程序中即可。注意:本文只是记录实验过程,实际系统中,将采用多种方式把xslt程序注入到内容提取器重。
第二步:执行如下代码(在windows10, python3.2下测试通过,源代码下载地址请见文章末尾GitHub),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码没有几行,足以见得Python之强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url="http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
&xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" &
&xsl:template match="/"&
&xsl:apply-templates select="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())&0 and count(.//*[@id='name']/h1/text())&0]" mode="商品"/&
&/xsl:template&
&xsl:template match="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())&0 and count(.//*[@id='name']/h1/text())&0]" mode="商品"&
&xsl:value-of select="*//*[@id='summary-price']/div[position()=2]/strong/text()"/&
&xsl:value-of select="*[@id='summary-price']/div[position()=2]/strong/text()"/&
&xsl:if test="@id='summary-price'"&
&xsl:value-of select="div[position()=2]/strong/text()"/&
&xsl:value-of select="*//*[@id='name']/h1/text()"/&
&xsl:value-of select="*[@id='name']/h1/text()"/&
&xsl:if test="@id='name'"&
&xsl:value-of select="h1/text()"/&
&/xsl:template&
&/xsl:stylesheet&""")
# 使用webdriver.PhantomJS
browser=webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:可以看到,网页中的手机名称和价格被正确抓取下来了
4,接下来阅读至此,我们通过两篇文章演示怎样抓取静态和动态网页内容,都采用了xslt一次性将需要的内容从网页上提取出来,其实xslt是一个比较复杂的程序语言,如果手工编写xslt,那么还不如写成离散的xpath。如果这个xslt不是手工写出来的,而是程序自动生成的,这就有意义了,程序员再也不要花时间编写和调测抓取规则了,这是很费时费力的工作。下一篇《》将讲述怎样生成xslt。5,集搜客GooSeeker开源代码下载源1.&
6,文档修改历史
:V2.0,增补文字说明:V2.1,增加第五章:源代码下载源,并更换github源的网址Python爬虫·AJAX动态页面的解析Python爬虫·AJAX动态页面的解析三体科技迷百家号上篇讲完了爬虫的模拟登陆。到此为止,大部分的网页的获取与分析应该都没有问题了。关于requests的timeout,verify等更多参数也不值得拿出来写一篇文章。大家自己稍微了解一下就行了。但是,某些网页是动态加载的,查看源代码会发现和网页本身显示的不一致。比如:http://funds.hexun.com/hotnews/点击翻页后链接本身没有变化,出现了新的内容,但网页源代码中根本看不到相关内容。注意左边的点,下面的几行开始右移了一点点,这些有偏移的新闻标题,都无法在源代码中找到相关内容。那么怎么爬取这种网站呢?鼠标右键,chrome的检查选项,点击Network,然后刷新页面。往下找到这个链接点击右边的Preview:好像就是想要的结果?注意到我们想要的就是这个内容,那么,在左边的链接上右键打开:open in new tab没错,就是这些那么我们的问题转为爬取这个页面,可以看出来就是静态文字,突然就变得简单多了。在链接中把cp=2,3,4就是相应页面的内容。我怎么知道的?可以在之前页面实际点一下翻页,发现下面出现了新的链接,对比一下之前链接,就是只有cp不一样,因此得知这是页面参数。之前不刷新页面,先点击翻页,更容易找到这个链接。总之,我们已经知道这个链接了,那么现在来构造一下请求:一定要熟练列表推导式!这个页面很简单,根本不需要lxml之类的库分析。我们只需要1个模块--Python标准库的json模块。首先导入,import json即可。由于json格式必须类似字典那样,hx_json02(...)中间的部分才能用json来分析,这些乱七八糟的东西本身是无用内容,所以我们要先处理一下得到的text。很简单,只要split('( ')[1].split(' )')[0]就拿到了中间的内容。建议熟悉一下replace()和strip()函数,虽然split()函数很好用(如果这都不知道,先去复习Python基础中的字符串处理部分!),很多时候其实不需要动用它。之后直接json.loads()即可把这个字符串变成dict类型,此时可能还是觉得很眼花缭乱,这时候我们转回来,重新看一下chrome浏览器的Preview框(上面有截图了),会发现结构化展示之后,我们比较容易看懂了。dict中,有一个叫result的key,value是一个列表,其中又是许多dict,这些dict中有4个key,分别是文章发布时间,链接,id和标题。再发一次理清逻辑之后,开始写代码:结果正常。有没有觉得这种页面比普通的html还要简单呢?我是这么认为了。差不多讲到这里应该结束了?按惯例,最后应该讲点tips。那么,先来思考一下,这个链接里的其他参数,有什么意义呢?要不要手动去更改一下试试看?以及,如果我还要爬这个网站的其他类似页面,可以直接找到链接吗,而不是先通过chrome观察半天?比如:http://funds.hexun.com/fundmarket/等。上面那个问题,自己动手一下就好,我就不再说了。下面这个问题,值得讲讲,这样我们就可以更加简易的获取到和讯网几乎全站的链接了。(因为基本上都是这个页面的格式)毕竟hotnews这些网页,上面一部分还是静态的,下面动态的结果不包含上面那些,如果知道怎么从这个网页直接拿到动态加载的页面链接,就等于知道怎么获取全部结果了。首先我们观察一下这个链接:似乎是id=和callback=hx_json02在每个类似页面都有变化。而且我们不太理解这些代表什么意思。后面这个的结果就在最后显示的页面,那么我们试试,去掉这些没意义的东西,直接callback=就结束:居然是更加完美的结果,不需要手动处理那些不知所以的字符了!可以直接json.loads()把这串str变成字典。id又是什么意思呢,怎么得到这个id?在之前的那个页面中,直接查看网页源代码,然后查找一下试试:有结果!虽然是javascript代码,有的读者可能看不懂,但是我们不需要管这些。我们只需要之前的链接,找到其中的id值,就知道动态加载的页面链接是什么了。不要脑子抽风不知道怎么拿哦,直接对resp.text进行split('hxPage.cmsID="')[1].split('";')[0]就是id了。简单粗暴的字符串切割就好。由于没有那些乱七八糟的字符,我们可以不用json标准库,用requests自带的json方法直接加载:整体的通过这样自动获取所有板块的所有标题的代码就不再截图了,代码在这:https://github.com/lucays/toutiao/tree/master/8今天就讲这么多,请动手试试更有体会哦!本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。三体科技迷百家号最近更新:简介:软硬件,手机数字,行业趋势,技术探索作者最新文章相关文章一,尝试用BeautifulSoup抓取
先打开KFC网站门店列表页面:http://www.kfc.com.cn/kfccda/storelist/index.aspx
可以看到门店列表如下图:
打开Chrome Developer Tools观察页面结构,找到标签如下:
发现要的数据位于id='listhtml'的表里,门店地址数据位于第二个tr开始的行里,尝试用bs抓取:
url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'
html = urllib.urlopen(url).read().decode('utf-8')
bsObj = BeautifulSoup(html, "html.parser")
print bsObj.find('tbody', {'id':'listhtml'})
&tbody id="listhtml"&
数据由ajax动态生成,抓取失败。
二,用selenium + PhantomJS抓取
url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'
# html = urllib.urlopen(url).read().decode('utf-8')
# bsObj = BeautifulSoup(html, "html.parser")
# print bsObj.find('tbody', {'id':'listhtml'})
driver = webdriver.PhantomJS(executable_path='/home/guowei/bin/phantomjs/bin/phantomjs')
driver.get(url)
print driver.find_element_by_id('listhtml')
输出结果:
&selenium.webdriver.remote.webelement.WebElement object at 0xb6823a8c&
有抓取到对象,但不能确定是否是包含需要的数据,再分析网页结构,抓出第一家门店地址看看:
print driver.find_element_by_id('listhtml').find_element_by_xpath('//tr[2]/td[1]').text输出结果:
说明已经成功抓取动态网页的数据!
三、抓取KFC门店数据
观察门店数据表格,所需数据从第二行开始,每行前2列表格数据有用,因此抓取代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'
driver = webdriver.PhantomJS(executable_path='/home/guowei/bin/phantomjs/bin/phantomjs')
driver.get(url)
time.sleep(2)
for i in range(1,11):
shopName_xpath = '//tr[' + str(i + 1) + ']/td[1]'
shopAddress_xpath = '//tr[' + str(i + 1) + ']/td[2]'
shopName = driver.find_element_by_css_selector('#listhtml').find_element_by_xpath(shopName_xpath).text
shopAddress = driver.find_element_by_css_selector('#listhtml').find_element_by_xpath(shopAddress_xpath).text
print shopName
print shopAddress输出结果:
吴江路269号2层
妙镜路1118号E号商铺
动力南广场餐厅
石龙路750-3号上海南站地下商场南馆
江苏路398号1、2层
天山路352号101和201
思贤路778--180号
人民西路955号
沪闵路9001号上海南站站厅层
桃浦路328号
马陆弘基餐厅
马陆镇沪宜公路号
time.sleep()非常重要,如果网速太慢有时候ajax程序还未从服务器取得数据,当然用检测一个特定HTML标签的方式会更高效,比如检测上述数据所在表格最后一行最后一格已经载入就可以开始抓取数据。
python3爬取今日头条(模拟ajax请求)
【2】Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1)
Python爬虫-分析Ajax抓取今日头条街拍美图
爬虫爬取ajax内容
python爬虫爬取ajax页面
python爬取ajax动态生成的数据 以抓取淘宝评论为例子
Python3爬虫之urllib爬取异步Ajax数据,使用post请求!
没有更多推荐了,Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页
  现在很多网站的都大量使用JavaScript,或者使用了Ajax技术。这样在网页加载完成后,url虽然不改变但是网页的DOM元素内容却可以动态的变化。如果处理这种网页是还用requests库或者python自带的urllib库那么得到的网页内容和网页在浏览器中显示的内容是不一致的。
  使用Selenium+PhantomJS。这两个组合在一起,可以运行非常强大的爬虫,可以处理cookie,JavaScript,header以及其他你想做的任何事情。&
安装第三方库
  Selenium是一个强大的网络数据采集工具,最初是为网站自动化测试开发的,其有对应的Python库;
  Selenium安装命令:
pip install selenium
安装PhantomJS
  PhantomJS是一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。通过编写js程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作。需要去官网下载对应平台的压缩文件;
PhantomJS(phantomjs-2.1.1-windows)下载地址:
下载PhantomJs 然后将 解压后的执行文件放在被设置过环境变量的地方,不设置的话,后续代码就要设, 所以这里直接放进来方便;
然后检测下,在cmd窗口输入phantomjs:
出现这样的画面,即表示成功;
  Selenium+PhantomJS示例代码:
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get('http://www.cnblogs.com/lizm166/p/8360388.html')
#获取网页源码
data = driver.page_source
print(data)
#获取元素的html源码
tableData = driver.find_elements_by_tag_name('tableData').get_attribute('innerHTML')
#获取元素的id值
tableI = driver.find_elements_by_tag_name('tableData').get_attribute('id')
#获取元素的文本内容
tableI = driver.find_elements_by_tag_name('tableData').text
driver.quit()
  能输出网页源码,说明安装成功
  通过这两者来解决客户端重定向问题的例子:
  程序首先加载了driver对象,然后请求网站,之后没0.5秒检测网站的html元素,如果html元素发生改变则认为页面发生了重定向,然后打印重定向后的页面内容。
  代码:
from selenium import webdriver
import time
from selenium.webdriver.remote.webelement import WebElement
from selenium.common.exceptions import StaleElementReferenceException
# 处理重定向,可以定时检查页面的某元素
# 如果和先前的不一致则可认为客户端重定向
def wait_for_load(driver):
#elem = driver.find_element_by_tag_name("html")
title = driver.find_element_by_tag_name("title")
#print(title)
while True:
count += 1
if count & 20:
print("Timing out after 10 seconds and returning")
time.sleep(.5)
newtitle = driver.find_element_by_tag_name("title")
if newtitle != title:
elem = driver.find_element_by_tag_name("html")
#except StaleElementReferenceException:
driver = webdriver.PhantomJS(executable_path='./phantomjs')
driver.get("http://pythonscraping.com/pages/javascript/redirectDemo1.html")
wait_for_load(driver)
print(driver.page_source)
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
def getData(dataUrl):
#获取ajax返回的页面(用bs4获取不到ajax返回的数据)
driver = webdriver.PhantomJS()
driver.get(dataUrl)
#获取table元素
tables = driver.find_elements_by_tag_name('table')
if tables is None:
print('网页加载获取数据失败')
logger.info('网页加载获取数据失败')
#获取table元素中的tr元素
trList = tables[0].find_elements_by_tag_name('tr')
if trList is None:
print('网页加载获取数据失败')
logger.info('网页加载获取数据失败')
for i in range(0,len(trList)):
#获取table元素中的tr元素中的td元素
tdList = trList[i].find_elements_by_tag_name('td')
if tdList is not None:
for n in range(0,len(tdList)):
#获取td元素文本内容
print("&&&&%s:%s"%(n,tdList[n].text))
driver.quit()
def getDataUrl(issueid):
dataUrl = ''
url = "http://******/Scsj_tjyb_issue.jsp"
headerDict = {'Host': '******',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.31 Safari/537.36',
'Accept': '*/*',
'Accept-Language': 'zh-CN,q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Origin':'http://******,
'Referer': 'http://******/tjyb_front/',
'Connection': 'keep-alive'}
data = {'AJAX': '<span style="color: #', 'TEMPLATE_ID': '<span style="color: #14',
'ISSUEID': issueid, 'CATALOGTYPE': 'main',
'LANGUAGE': 'zh', 'HEAD': ''}
res = requests.post(url, data=data, headers=headerDict)
# 获取跳转后的页面源码,返回json串
soup = BeautifulSoup(res.content, "html.parser")
if soup.find_all('a',target='_blank') is not None:
for a_url in soup.find_all('a',target='_blank'):
if a_url.string == '******统计表':
dataUrl=a_url['href']
print("未获取到a标签")
logger.info("未获取到a标签")
print('http://******'+dataUrl)
return 'http://******'+dataUrl
if __name__ == '__main__':
url = getDataUrl('<span style="color: #7')
getData(url)
阅读(...) 评论()}

我要回帖

更多关于 随机数表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信