二.动态网页抓取

二.动态网页抓取,第1张

因此,我们如果使用 AJAX 加载的动态网页,怎么爬取里面动态加载的内容呢?有两种方法

方法1操作步骤:

步骤:

selenium选择元素的方法有很多:

有时候,我们需要查找多个元素。在上述例子中,我们就查找了所有的评论。因此,也有对应的元素选择方法,就是在上述的element后加上s,变成elements。

其中xpath和css_selector是比较好的方法,一方面比较清晰,另一方面相对其他方法定位元素比较准确。

除此之外,我们还可以使用selenium操作元素方法实现自动操作网页。常见的操作元素方法如下:

– clear 清除元素的内容

– send_keys 模拟按键输入

– click 点击元素

– submit 提交表单

由于篇幅有限,有兴趣的读者,可以到selenium的官方文档查看: http://selenium-python.readthedocs.io/index.html

这是我写的一个非常简单的抓取页面的脚本,作用为获得指定URL的所有链接地址并获取所有链接的标题。

===========geturls.py================

#coding:utf-8

import urllib

import urlparse

import re

import socket

import threading

#定义链接正则

urlre = re.compile(r"href=[\"']?([^ >\"']+)")

titlere = re.compile(r"<title>(.*?)</title>",re.I)

#设置超时时间为10秒

timeout = 10

socket.setdefaulttimeout(timeout)

#定义最高线程数

max = 10

#定义当前线程数

current = 0

def gettitle(url):

global current

try:

content = urllib.urlopen(url).read()

except:

current -= 1

return

if titlere.search(content):

title = titlere.search(content).group(1)

try:

title = title.decode('gbk').encode('utf-8')

except:

title = title

else:

title = "无标题"

print "%s: %s" % (url,title)

current -= 1

return

def geturls(url):

global current,max

ts = []

content = urllib.urlopen(url)

#使用set去重

result = set()

for eachline in content:

if urlre.findall(eachline):

temp = urlre.findall(eachline)

for x in temp:

#如果为站内链接,前面加上url

if not x.startswith("http:"):

x = urlparse.urljoin(url,x)

#不记录js和css文件

if not x.endswith(".js") and not x.endswith(".css"):

result.add(x)

threads = []

for url in result:

t = threading.Thread(target=gettitle,args=(url,))

threads.append(t)

i = 0

while i <len(threads):

if current <max:

threads[i].start()

i += 1

current += 1

else:

pass

geturls("http://www.baidu.com")

使用正则表达式(re)只能做到一些比较简单或者机械的功能,如果需要更强大的网页分析功能,请尝试一下beautiful soup或者pyquery,希望能帮到你

下面这个程序是抓取网页的一个例子,MyOpener类是为了模拟浏览器客户端,并采用随机选取的方式以防网站将你认为是机器人。

MyFunc函数抓取你指定的url,并提取了其中的href链接,图片的获取类似,一般是<img src=xxx>这样的形式,其他的功能应该也不难,去网上搜下应该有些例子。

import re

from urllib import FancyURLopener

from random import choice

user_agents = [

'Mozilla/5.0 (WindowsUWindows NT 5.1itrv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',

'Opera/9.25 (Windows NT 5.1Uen)',

'Mozilla/4.0 (compatibleMSIE 6.0Windows NT 5.1SV1.NET CLR 1.1.4322.NET CLR 2.0.50727)',

'Mozilla/5.0 (compatibleKonqueror/3.5Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',

'Mozilla/5.0 (X11ULinux i686en-USrv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',

'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9'

]

class MyOpener(FancyURLopener, object):

version = choice(user_agents)

def MyFunc(url):

myopener = MyOpener()

s = myopener.open(url).read()

ss=s.replace("\n"," ")

urls=re.findall(r"<a.*?href=.*?<\/a>",ss,re.I)#寻找href链接

for i in urls:

do sth.


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/101499.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-09
下一篇2023-03-09

发表评论

登录后才能评论

评论列表(0条)

    保存