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

优采云 发布时间: 2020-08-08 00:01

  I. 前言

  此文章以前曾用于培训新手. 每个人都觉得它很容易理解,因此我与所有人共享并学习了. 如果您已经学习了一些python并想用它做一些事但没有方向,那么不妨尝试完成以下案例.

  第二,环境准备

  安装三个请求库lxml beautifulsoup4(以下代码均在python3.5环境中进行了测试)

  

pip install requests lxml beautifulsoup4

  

  三个,一些小小的爬虫

  3.1获取本地公网IP地址

  利用在公共Internet上查询IP的借口,使用python的请求库自动获取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))

  

  3.2使用百度搜索界面编写网址采集

  在这种情况下,我们将结合使用请求和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的背景地址,效果如下:

  

  3.3自动下载搜狗壁纸

  在此示例中,我们将使用采集器自动下载搜索到的墙纸,并将程序中存储图片的路径更改为要存储图片的目录路径. 另一点是,我们在程序中使用了json库. 这是因为在观察过程中,我们发现Sogou的墙纸地址以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)

  3.4自动填写问卷

  目标官方网站:

  目标问卷:

  

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提交多个调查表时,将触发目标的反爬行机制,并且服务器将显示验证码.

  

  

  我们可以使用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自动填写调查表]

  3.5获取公网代理IP,判断是否可以使用以及延迟时间

  在此示例中,我们要在[Xi Spur代理]上爬网代理IP,并验证这些代理的生存能力和延迟时间. (您可以将爬网的代理IP添加到代理链,然后执行正常的渗透任务. )在这里,我直接调用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做很多有趣的事情.

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线