python动态url
① url编码问题在python中怎么解决
最近在抓取一些js代码产生的动态数据,需要模拟js请求获得所需用的数据,遇到对url进行编码和解码的问题,就把遇到的问题总结一下,有总结才有进步,才能使学到的知识更加清晰。对url进行编码和解码,python提供了很方便的接口进行调用。
url中的query带有特殊字符(不是url的保留字)时需要进行编码。当url中带有汉字时,需要特殊的处理才能正确编码,以下都只针对这种情形,当然也适用于纯英文字符的url。
(1) url编码:
import urllib
url = 'wd=哈哈' #如果此网站编码是gbk的话,需要进行解码,从gbk解码成unicode,再从Unicode编码编码为utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
结果: 3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88
(2) url解码:
import urllib
encoded_url = est.com%2fs%3fwd%3d%e5%93%88%e5%93%88'
print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace') #反过来
函数调用的参数以及结果都是utf-8编码的,所以在对url编码时,需要将参数串的编码从原始编码转换成utf-8,
对url解码时,需要将解码结果从utf-8转换成原始编码格式。
依据网站采用的编码不同,或是gbk或是utf-8,赋赋予不同的编码,进行不同的url转码。GBK格式,一个中文字符转为%xx%xx,共两组;utf-8格式,一个中文字符转为%xx%xx%xx,共三组。
>>>importsys,urllib
>>>s='杭州'
>>>urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
%BA%BC%D6%DD
>>>urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
'%E6%9D%AD%E5%B7%9E'
a="墨西哥女孩被拐4年接客4万次生的孩子成为人质-搜狐新闻"
printurllib.quote(urllib.quote(a))
[python]view plain
进行两次编码转换后,会变为:%25E5%25A2%25A8%25E8%25A5%25BF%25E5%2593%25A5%25E5%25A5%25B3%25E5%25AD%25A9%25E8%25A2%25AB%25E6%258B%25904%25E5%25B9.................................................................................这样的形式。
同样需要两次解码后才能得到中文。
最近用python写了个小爬虫自动下点东西,但是url 是含中文的,而且中文似乎是 gbk 编码然后转成 url的。举个例子吧,我如果有个unicode字符串“历史上那些牛人们.pdf”,那么我转换成url之后是,
t="%20%E5%8E%86%E5%8F%B2%E4%B8%8A%E9%82%A3%E4%BA%9B%E7%89%9B%E4%BA%BA%E4%BB%AC.pdf",
但是对方网站给的是 s="%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF"
>>>print urllib.unquote("%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF").decode('gbk').encode('utf-8')
>>>历史上那些牛人们.PDF
② python怎么获取动态网页链接
四中方法:
'''
得到当前页面所有连接
'''
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver
url = 'http://www.ok226.com'
r = requests.get(url)
r.encoding = 'gb2312'
# 利用 re
matchs = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" , r.text)
for link in matchs:
print(link)
print()
# 利用 BeautifulSoup4 (DOM树)
soup = BeautifulSoup(r.text,'lxml')
for a in soup.find_all('a'):
link = a['href']
print(link)
print()
# 利用 lxml.etree (XPath)
tree = etree.HTML(r.text)
for link in tree.xpath("//@href"):
print(link)
print()
# 利用selenium(要开浏览器!)
driver = webdriver.Firefox()
driver.get(url)
for link in driver.find_elements_by_tag_name("a"):
print(link.get_attribute("href"))
driver.close()
③ 如何用python爬取网页中隐藏的div内容
你说的隐藏的div内容,应该是动态加载的数据吧,不在网页源码中显示,只在加载网页时才请求数据进行显示,一般情况下,这种数据都保存在一个json文件中,只要抓包分析出这个json文件的url地址,然后再根据json文件结构进行解析,很快就能获取到动态加载的div数据,下面我以爬取人人贷上面的散标数据为例,简单介绍一下python如何爬芦枝取div动态加载的数据,实验环境win10+python3.6+pycharm5.0,主要步骤如下:
1.首先,打开散标数族咐据,如下,爬取的信息主要包括年利率、借款标题、期限、金额和进度这5个字段信息:
右键对应元素进行检查,可以看出所有的数据嵌套在div标签中,如下:
打开网页源码,我们按Ctrl+F查找对应的数据,会发现所查找的数据都未在网页源码中,如下,即数据都是动态加载,所以直接解析原网页是找不到div嵌套的数据的:
2.接着,我们按F12调出开发者工具,依次点击“Network”->“XHR”,F5刷新页面,就会看到动态加载的json文件,查看这个文件,内容如下,左边为json文件的url地址,右边就是我们需要爬取的div数据:
3.最后对应上面的json文件,我们就可以直接获取并解析json了,这里主要用到requests和json这2个模块,其中requests用于根据url地址获取json文件,json用于解析json文件,提取出我们所需要的信息,即div动态加载的数据,测试代码如下,非常简单:
运行程序,截图如下,已经成功爬取到div加载的数据:
至此,我们就完成了利用python爬取div动态加载的数据。总的来说,整个过程非常简单,最主要的陪穗敏还是抓包分析,只要你有一定的爬虫基础,熟悉一下上面的代码,多调试几遍程序,很快就能掌握的,当然,你也可以使用selenium进行爬取,直接解析就行,网上也有相关教程和资料可供参考,非常丰富,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言。
④ 如何用Python爬取动态加载的网页数据
动态网页抓取都是典型的办法
直接查看动态网页的加载规则。如果是ajax,则将ajax请求找出来给python。 如果是js去处后生成的URL。就要阅读JS,搞清楚规则。再让python生成URL。这就是常用办法
办法2,使用python调用webkit内核的,IE内核,或者是firefox内核的浏览器。然后将浏览结果保存下来。通常可以使用浏览器测试框架。它们内置了这些功能
办法3,通过http proxy,抓取内容并进行组装。甚至可以嵌入自己的js脚本进行hook. 这个方法通常用于系统的反向工程软件
⑤ 【壹】Python爬虫入门——认识URL
【系列前言】前段时间李响同学入门了一些Python的基础知识,觉得一直在IDLE里print一些算法题有一些枯燥,所以决定通过学习爬虫来提高自己的兴趣。而且最近确实有一些重复性劳动,想使用爬虫简化工作。遂打算边自学边写自己自学的过程,一方面作为小白的我可以和其他Python大神交流,一方面也可以以此监督自己。
【本人使用Python版本:2.7.5】
首先按理解一下爬虫(Spider),如果把一个站点比作一张纵横交错的蜘蛛网,那么我们爬虫要做的就是在这张网上爬来爬去,获得这张网上的信息和资源。而Web上每种资源,比如HTML文档、图片、视频等都由一个URI(Universal Resource Identifier,通用资源标志符)进行定位。 URL(Uniform Resource Locator,统一资源定位符)是URI的子集。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。而爬虫主要的处理对象就是URL。所以务必要对URL有一定的熟悉。
URI通常由三部分组成:
1.访问资源的命名机制;
2.存放资源的主机名;
3.资源自身 的名称,由路径表示。
URL的格式由三部分组成:
1.第一部分是协议(或称为服务方式)。
2.第二部分是存有该资源的主机IP地址(有时也包括端口号)。
3.第三部分是主机资源的具体地址,如目录和文件名等。
知乎:HTTP 协议中 URI 和 URL 有什么区别?@西毒 的回答
最近在搞挑战杯可能会有点忙,但还是希望自己能按照计划学习,定期更新此系列。
⑥ python指定url
今天简单使用了一下python的re模块和lxml模块,分别利用的它们提供的正则表达式和xpath来解析页面源码从中提取所需的title,xpath在完成这样的小任务上效率非常好,在这里之所以又使用了一下正则表达式是因为xpath在处理一些特殊的页面的时候会出现乱码的情况,当然这不是xpath的原因,而是页面本身编码,跟utf-8转码之间有冲突所致,这里看代码:
python抽取指定url页面的title方法(python获取当前页面的url) python 抽取 url title 脚本之家 第1张
# !/usr/bin/python
#-*-coding:utf-8-*-
'''
功能:抽取指定url的页面内容中的title
'''
import re
import chardet
import urllib
from lxml import etree
def utf8_transfer(strs):
'''
utf8编码转换
'''
try:
if isinstance(strs, unicode):
strs = strs.encode('utf-8')
elif chardet.detect(strs)['encoding'] == 'GB2312':
strs = strs.decode("gb2312", 'ignore').encode('utf-8')
elif chardet.detect(strs)['encoding'] == 'utf-8':
strs = strs.decode('utf-8', 'ignore').encode('utf-8')
except Exception, e:
print 'utf8_transfer error', strs, e
return strs
def get_title_xpath(Html):
'''
用xpath抽取网页Title
'''
Html = utf8_transfer(Html)
Html_encoding = chardet.detect(Html)['encoding']
page = etree.HTML(Html, parser=etree.HTMLParser(encoding=Html_encoding
⑦ 从零开始学Python-使用Selenium抓取动态网页数据
AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重带洞新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必蠢者枯须重载整个网页页面。
因为传统的网页在传输数据格式方面,使用的是 XML 语法,因此叫做 AJAX ,其实现在数据交互基本上都是使用 JSON 。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在 右键->查看网页源代码 还是不能看到通嫌隐过ajax加载的数据,只能看到使用这个url加载的html代码。
法1:直接分析ajax调用的接口。然后通过代码请求这个接口。
法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
Selenium 相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。 chromedriver 是一个驱动 Chrome 浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
现在以一个简单的获取网络首页的例子来讲下 Selenium 和 chromedriver 如何快速入门:
参考:Selenium的使用
直接直接分析ajax调用的接口爬取
selenium结合lxml爬取