欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

十几年来总结的最经典的项目,用来做python爬虫实践教学!

程序员文章站 2022-06-27 14:22:33
一、前言 这篇文章之前是给新人培训时用的,大家觉的挺好理解的,所以就分享出来,与大家一起学习。如果你学过一些python,想用它做些什么又没有方向,不妨试试完成下面几个案例。 二、环境准备 安装requests lxml beautifulsoup4 三个库(下面代码均在python3.5环境下通过 ......

一、前言

这篇文章之前是给新人培训时用的,大家觉的挺好理解的,所以就分享出来,与大家一起学习。如果你学过一些python,想用它做些什么又没有方向,不妨试试完成下面几个案例。

二、环境准备

十几年来总结的最经典的项目,用来做python爬虫实践教学!

安装requests lxml beautifulsoup4 三个库(下面代码均在python3.5环境下通过测试)

pip install requests lxml beautifulsoup4
十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

三、几个爬虫小案例

  • 获取本机公网ip地址
  • 利用百度搜索接口,编写url采集器
  • 自动下载搜狗壁纸
  • 自动填写调查问卷
  • 获取公网代理ip,并判断是否能用、延迟

3.1 获取本机公网ip地址

利用公网上查询ip的借口,使用python的requests库,自动获取ip地址。

import requests
r = requests.get("http://2017.ip138.com/ic.asp")
r.encoding = r.apparent_encoding #使用requests的字符编码智能分析,避免中文乱码
print(r.text)
# 你还可以使用正则匹配re模块提取出ip
import re
print(re.findall("d{1,3}.d{1,3}.d{1,3}.d{1,3}",r.text))
十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

3.2 利用百度搜索接口,编写url采集器

这个案例中,我们要使用requests结合beautifulsoup库来完成任务。我们要在程序中设置user-agent头,绕过百度搜索引擎的反爬虫机制(你可以试试不加user-agent头,看看能不能获取到数据)。注意观察百度搜索结构的url链接规律,例如第一页的url链接参数pn=0,第二页的url链接参数pn=10…. 依次类推。这里,我们使用css选择器路径提取数据。

import requests
from bs4 import beautifulsoup
# 设置user-agent头,绕过百度搜索引擎的反爬虫机制
headers = {'user-agent': 'mozilla/5.0 (x11; linux x86_64; rv:52.0) gecko/20100101 firefox/52.0'}
# 注意观察百度搜索结构的url链接规律,例如第一页pn=0,第二页pn=10.... 依次类推,下面的for循环搜索前10页结果
for i in range(0,100,10):
bd_search = "https://www.baidu.com/s?wd=inurl:/dede/login.php?&pn=%s" % str(i)
r = requests.get(bd_search,headers=headers)
soup = beautifulsoup(r.text,"lxml")
# 下面的select使用了css选择器路径提取数据
url_list = soup.select(".t > a")
for url in url_list:
real_url = url["href"]
r = requests.get(real_url)
print(r.url)

编写好程序后,我们使用关键词inurl:/dede/login.php 来批量提取织梦cms的后台地址,效果如下:

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

3.3 自动下载搜狗壁纸

这个例子,我们将通过爬虫来自动下载搜过壁纸,程序中存放图片的路径改成你自己想要存放图片的目录路径即可。还有一点,程序中我们用到了json库,这是因为在观察中,发现搜狗壁纸的地址是以json格式存放,所以我们以json来解析这组数据。

import requests
import json
#下载图片
url = "http://pic.sogou.com/pics/channel/getallrecompicbytag.jsp?category=%e5%a3%81%e7%ba%b8&tag=%e6%b8%b8%e6%88%8f&start=0&len=15&width=1366&height=768"
r = requests.get(url)
data = json.loads(r.text)
for i in data["all_items"]:
img_url = i["pic_url"]
# 下面这行里面的路径改成你自己想要存放图片的目录路径即可
with open("/home/evilk0/desktop/img/%s" % img_url[-10:]+".jpg","wb") as f:
r2 = requests.get(img_url)
f.write(r2.content)
print("下载完毕:",img_url)
十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

3.4 自动填写调查问卷

目标官网:https://www.wjx.cn

目标问卷:https://www.wjx.cn/jq/21581199.aspx

import requests
import random
url = "https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curid=21581199&t=1521463484600&starttime=2018%2f3%2f19%2020%3a44%3a30&rn=990598061.78751211"
data = {
"submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
"user-agent" : "mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko)",
"cookie": ".aspxanonymous=ibuvxgz20wekaaaazgy4mde1mjctnwu4ni00mduwltgwyjqtmjfhmmzhmde2mta3h_bb3gnw4xrpsyh-qph4xw1mfj41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; um_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100cbe37c329c8a3eeeee289b573446f594297cc3bb3c355f09187f5adcc492ebb07a9cc65cd43ad3e795c914cd57017ee3799e92f0e2762c963ef0912; wjxuser=username=17750277425&type=1; lastcheckupdatedate=1; lastcheckdesign=1; deleteqcookie=1; _cnzz_cv4478442=%e7%94%a8%e6%88%b7%e7%89%88%e6%9c%ac%7c%e5%85%8d%e8%b4%b9%e7%89%88%7c1521461468568; jac21581199=78751211; cnzzdata4478442=cnzz_eid%3d878068609-1521456533-https%253a%252f%252fwww.baidu.com%252f%26ntime%3d1521461319; hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
}
for i in range(0,500):
choice = (
random.randint(1, 2),
random.randint(1, 4),
random.randint(1, 3),
random.randint(1, 4),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
)
data["submitdata"] = data["submitdata"] % choice
r = requests.post(url = url,headers=header,data=data)
print(r.text)
data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"

当我们使用同一个ip提交多个问卷时,会触发目标的反爬虫机制,服务器会出现验证码。

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

我们可以使用x-forwarded-for来伪造我们的ip,修改后代码如下:

import requests
import random
url = "https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curid=21581199&t=1521463484600&starttime=2018%2f3%2f19%2020%3a44%3a30&rn=990598061.78751211"
data = {
"submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
"user-agent" : "mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko)",
"cookie": ".aspxanonymous=ibuvxgz20wekaaaazgy4mde1mjctnwu4ni00mduwltgwyjqtmjfhmmzhmde2mta3h_bb3gnw4xrpsyh-qph4xw1mfj41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; um_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100cbe37c329c8a3eeeee289b573446f594297cc3bb3c355f09187f5adcc492ebb07a9cc65cd43ad3e795c914cd57017ee3799e92f0e2762c963ef0912; wjxuser=username=17750277425&type=1; lastcheckupdatedate=1; lastcheckdesign=1; deleteqcookie=1; _cnzz_cv4478442=%e7%94%a8%e6%88%b7%e7%89%88%e6%9c%ac%7c%e5%85%8d%e8%b4%b9%e7%89%88%7c1521461468568; jac21581199=78751211; cnzzdata4478442=cnzz_eid%3d878068609-1521456533-https%253a%252f%252fwww.baidu.com%252f%26ntime%3d1521461319; hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
"x-forwarded-for" : "%s"
}
for i in range(0,500):
choice = (
random.randint(1, 2),
random.randint(1, 4),
random.randint(1, 3),
random.randint(1, 4),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
random.randint(1, 3),
)
data["submitdata"] = data["submitdata"] % choice
header["x-forwarded-for"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255))
r = requests.post(url = url,headers=header,data=data)
print(header["x-forwarded-for"],r.text)
data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
header["x-forwarded-for"] = "%s"

效果图:

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

关于这篇文章,因为之前写过,不赘述,感兴趣直接看: 【如何通过python实现自动填写调查问卷】

3.5 获取公网代理ip,并判断是否能用、延迟时间

这一个例子中,我们想爬取 【西刺代理】上的代理ip,并验证这些代理的存活性以及延迟时间。(你可以将爬取的代理ip添加进proxychain中,然后进行平常的渗透任务。)这里,我直接调用了linux的系统命令ping -c 1 " + ip.string + " | awk 'nr==2{print}' - ,如果你想在windows中运行这个程序,需要修改倒数第三行os.popen中的命令,改成windows可以执行的即可。

from bs4 import beautifulsoup
import requests
import os
url = "http://www.xicidaili.com/nn/1"
headers = {'user-agent': 'mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko) chrome/62.0.3202.62 safari/537.36'}
r = requests.get(url=url,headers=headers)
soup = beautifulsoup(r.text,"lxml")
server_address = soup.select(".odd > td:nth-of-type(4)")
ip_list = soup.select(".odd > td:nth-of-type(2)")
ports = soup.select(".odd > td:nth-of-type(3)")
for server,ip in zip(server_address,ip_list):
if len(server.contents) != 1:
print(server.a.string.ljust(8),ip.string.ljust(20), end='')
else:
print("未知".ljust(8), ip.string.ljust(20), end='')
delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'nr==2{print}' -")
delay_time = delay_time.read().split("time=")[-1].strip(" ")
print("time = " + delay_time)
十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

十几年来总结的最经典的项目,用来做python爬虫实践教学!

 

四、结语

当然,你还可以用python干很多有趣的事情。