如何利用Python爬虫从网页上批量获取想要的信息

Python018

如何利用Python爬虫从网页上批量获取想要的信息,第1张

python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写。python在生物信息、统计、网页制作、计算等多个领域都体现出了强大的功能。python和其他脚本语言如java、R、Perl 一样,都可以直接在命令行里运行脚本程序。工具/原料

python;CMD命令行;windows操作系统

方法/步骤

1、首先下载安装python,建议安装2.7版本以上,3.0版本以下,由于3.0版本以上不向下兼容,体验较差。

2、打开文本编辑器,推荐editplus,notepad等,将文件保存成 .py格式,editplus和notepad支持识别python语法。

脚本第一行一定要写上 #!usr/bin/python

表示该脚本文件是可执行python脚本

如果python目录不在usr/bin目录下,则替换成当前python执行程序的目录。

3、编写完脚本之后注意调试、可以直接用editplus调试。调试方法可自行百度。脚本写完之后,打开CMD命令行,前提是python 已经被加入到环境变量中,如果没有加入到环境变量,请百度

4、在CMD命令行中,输入 “python” + “空格”,即 ”python “;将已经写好的脚本文件拖拽到当前光标位置,然后敲回车运行即可。

#coding:utf-8

#author:www.chenhaifei.com

import requests #打开

import time,random #控制时间

import sys #专门乱码的

reload(sys)

sys.setdefaultencoding(‘utf-8’)

headers={

‘User-Agent’:’Mozilla/5.0 (Windows NT 6.1WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36′,

}

url=’http://www.chenhaifei.com/’ ##检测的url

cont = requests.get(url,allow_redirects = False).status_code ##allow_redirects = False不检测跳转后的状态码

print cont

time.sleep(0.5)

上面是单个判断url状态码的,你可以把想要检测的url放在一个txt里面,这样就可以循环检测了。

我们将会按照以下步骤进行:

提取登录需要的详细信息

执行站点登录

爬取所需要的数据

在本教程中,我使用了以下包(可以在 requirements.txt 中找到):

requests

lxml

步骤一:研究该网站

打开登录页面

进入以下页面 “”。你会看到如下图所示的页面(执行注销,以防你已经登录)

仔细研究那些我们需要提取的详细信息,以供登录之用

在这一部分,我们会创建一个字典来保存执行登录的详细信息:

1. 右击 “Username or email” 字段,选择“查看元素”。我们将使用 “name” 属性为 “username” 的输入框的值。“username”将会是 key 值,我们的用户名/电子邮箱就是对应的 value 值(在其他的网站上这些 key 值可能是 “email”,“ user_name”,“ login”,等等)。

2. 右击 “Password” 字段,选择“查看元素”。在脚本中我们需要使用 “name” 属性为 “password” 的输入框的值。“password” 将是字典的 key 值,我们输入的密码将是对应的 value 值(在其他网站key值可能是 “userpassword”,“loginpassword”,“pwd”,等等)。

3. 在源代码页面中,查找一个名为 “csrfmiddlewaretoken” 的隐藏输入标签。“csrfmiddlewaretoken” 将是 key 值,而对应的 value 值将是这个隐藏的输入值(在其他网站上这个 value 值可能是一个名为 “csrftoken”,“ authenticationtoken” 的隐藏输入值)。列如:“Vy00PE3Ra6aISwKBrPn72SFml00IcUV8”。

最后我们将会得到一个类似这样的字典:

payload = {

"username": "<USER NAME>",

"password": "<PASSWORD>",

"csrfmiddlewaretoken": "<CSRF_TOKEN>"

}

请记住,这是这个网站的一个具体案例。虽然这个登录表单很简单,但其他网站可能需要我们检查浏览器的请求日志,并找到登录步骤中应该使用的相关的 key 值和 value 值。

步骤2:执行登录网站

对于这个脚本,我们只需要导入如下内容:

import requests

from lxml import html

首先,我们要创建 session 对象。这个对象会允许我们保存所有的登录会话请求。

session_requests = requests.session()

第二,我们要从该网页上提取在登录时所使用的 csrf 标记。在这个例子中,我们使用的是 lxml 和 xpath 来提取,我们也可以使用正则表达式或者其他的一些方法来提取这些数据。

login_url = ""

result = session_requests.get(login_url)

tree = html.fromstring(result.text)

authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

接下来,我们要执行登录阶段。在这一阶段,我们发送一个 POST 请求给登录的 url。我们使用前面步骤中创建的 payload 作为 data 。也可以为该请求使用一个标题并在该标题中给这个相同的 url 添加一个参照键。

result = session_requests.post(

login_url,

data = payload,

headers = dict(referer=login_url)

)

步骤三:爬取内容

现在,我们已经登录成功了,我们将从 bitbucket dashboard 页面上执行真正的爬取操作。

url = ''

result = session_requests.get(

url,

headers = dict(referer = url)

)

为了测试以上内容,我们从 bitbucket dashboard 页面上爬取了项目列表。我们将再次使用 xpath 来查找目标元素,清除新行中的文本和空格并打印出结果。如果一切都运行 OK,输出结果应该是你 bitbucket 账户中的 buckets / project 列表。

tree = html.fromstring(result.content)

bucket_elems = tree.findall(".//span[@class='repo-name']/")

bucket_names = [bucket.text_content.replace("n", "").strip() for bucket in bucket_elems]

print bucket_names

你也可以通过检查从每个请求返回的状态代码来验证这些请求结果。它不会总是能让你知道登录阶段是否是成功的,但是可以用来作为一个验证指标。

例如:

result.ok # 会告诉我们最后一次请求是否成功

result.status_code # 会返回给我们最后一次请求的状态

就是这样。