python怎么获取动态网页链接?

Python019

python怎么获取动态网页链接?,第1张

四中方法:

'''

得到当前页面所有连接

'''

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()

最近在抓取一些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,共三组。

>>> import sys,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'

[python] view plain copy

a = "墨西哥女孩被拐4年接客4万次 生的孩子成为人质-搜狐新闻"

print urllib.quote(urllib.quote(a))

进行两次编码转换后,会变为:%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

函数前加入:

global AllURL

AllURL=[]

for i in webUrl :加入如下判断

if i in ALLURL:

continue

else:

ALLURL.append(i)

花了很多时间测试了楼主的代码,有如下问题与楼主商讨:

1.如果访问某个网页出错,没有设定应对情况,例如404,程序中断;

2.如果访问动态网站,该网站可能针对request的url改写网页中的相对路径,例如:

y页面中有相对路径为/xxx/,则与url构成url/xxx/,网站将其重定向至网页 y;

调用catchurl后,路径变成url/xxx/xxx/......在调用,再递增。。。。直至python不能接受路径的长度为止;用全局变量ALLURL不能解决这个问题。

所以在程序中是否加入对网页的比较,如果是同一网页,则跳出。