教程:python爬虫实践教学,*敏*感*词*入门

优采云 发布时间: 2022-10-16 12:22

  教程:python爬虫实践教学,*敏*感*词*入门

  一、简介

  这个文章以前是用来训练新人的。大家觉得好理解,就分享给大家学习。如果你学过一些python,想用它做点什么,但没有方向,不妨尝试完成以下案例。

  老规矩,需要打包软件关注小编,QQ群:721195303领取。

  2、环境准备

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

  pip install requests lxml beautifulsoup4

  3.几个爬虫小案例 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))

  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的后台地址,效果如下:

  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)

<p>

    print("下载完毕:",img_url)</p>

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

<p>

        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"</p>

  效果图:

  关于这个文章,因为之前写过,不再赘述

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

  在此示例中,我们要抓取代理 IP 并验证这些代理的活跃度和延迟。(可以将爬取的代理IP添加到proxychain中,然后执行平时的渗透任务。)这里我直接调用linux系统命令

  ping -c 1 " + ip.string + " | awk 'NR==2{打印}' -

  如果要在windows下运行这个程序,需要修改os.popen中倒数第三行的命令,改成windows可以执行的东西。

  from bs4 import BeautifulSoup

import requests

import os

url = "http://www.xicidaili.com/nn/1"

headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36&#39;}

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=&#39;&#39;)

    else:

        print("未知".ljust(8), ip.string.ljust(20), end=&#39;&#39;)

    delay_time = os.popen("ping -c 1 " + ip.string + " | awk &#39;NR==2{print}&#39; -")

    delay_time = delay_time.read().split("time=")[-1].strip("\r\n")

    print("time = " + delay_time)

  4。结论

  当然,你也可以用 python 做很多有趣的事情。如果上面的例子你不明白,那我最后再发一套python爬虫入门教程:python网络爬虫介绍---我爷爷都能看懂。现在网上学习真的很多,希望大家可以好好利用。

  这里推荐一下我自己建的Python学习群:721195303。群里的每个人都在学习Python。如果您想学习或正在学习Python,欢迎您的加入。大家都是软件开发党,不定期分享干货(仅限Python软件开发相关),包括我自己整理的2021最新Python进阶资料和零基础教学,欢迎进阶有兴趣的小伙伴加入Python!

  核心方法:【PYTHON爬虫学习笔记】第二章 爬虫基础

  URL 是 URI 的子集,即每个 URL 都是 URI,但不是每个 URI 都是 URL。

  那么,什么样的 URI 不是 URL?

  URI还包括一个子类URN,其全称是Universal Resource Name,即统一资源名称。URN 只命名资源,不指定如何定位资源。例如 urn:isbn:0451450523 指定一本书的 ISBN,可以唯一标识该书,但不指定该书的位置。这是URN。URL、URN 和 URI 之间的关系可以用图 2-1 表示。

  URL、URN和URI关系图

  2.1.2 超文本

  超文本,它的英文名字是hypertext,我们在浏览器中看到的网页都是从超文本解析出来的,而网页的源代码是一系列的HTML代码,里面收录了一系列的标签,比如img来显示图片, p 指定显示段落等。浏览器解析这些标签后,就形成了我们平时看到的网页,以及网页的源代码。

  2.1.3 HTTP和HTTPS HTTP的全称是超文本传输​​协议,中文名称是超文本传输​​协议。HTTP 协议是一种将超文本数据从网络传输到本地浏览器的传输协议,它确保了超文本文档的高效和准确传递。HTTPS的全称是Hyper Text Transfer Protocol over Secure Socket Layer。它是一个安全的 HTTP 通道,简单来说就是 HTTP 的安全版本,即在 HTTP 上增加了 SSL 层,简称 HTTPS。HTTPS 的安全基础是 SSL,因此通过它传输的内容是经过 SSL 加密的。其主要功能可分为两种。2.1.4 HTTP请求流程

  我们在浏览器中输入一个 URL,然后回车,在浏览器中观察页面内容。其实这个过程就是浏览器向网站所在的服务器发送请求,网站服务器接收到请求并处理解析,然后返回相应的响应,即然后发送回浏览器。. 响应收录页面的源代码和其他内容,浏览器对其进行解析以呈现页面。模型如图所示。

  2.1.5 请求

  从客户端发送到服务器的请求可以分为四个部分:请求方法、请求 URL、请求标头和请求正文。

  请求方法

  常用请求方法:GET 和 POST

  GET 和 POST 请求方法有以下区别。

  其他请求方式:

  请求的 URL

  即Uniform Resource Locator URL,它唯一地确定了我们要请求的资源

  请求头

  请求头用于描述服务器要使用的附加信息。比较重要的信息是Cookie、Referer、User-Agent等。

  请求正文

  请求体携带的内容一般是POST请求中的表单数据,而对于GET请求,请求体是空的。

  在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并且在设置各种请求库的参数时知道使用的是哪个Content-Type,否则可能会导致POST无法正常响应提交后。

  2.1.6 响应

  服务器返回给客户端的响应可以分为三部分:响应状态码、响应头和响应体。

  响应状态代码

  响应状态码表示服务器的响应状态。例如,200 表示服务器正常响应,404 表示页面未找到,500 表示服务器发生错误。在爬虫中,我们可以根据状态码判断服务器响应状态。

  响应头中收录了服务器对请求的响应信息,如Content-Type、Server、Set-Cookie等。下面简单介绍一些常用的头信息。

  响应体

  响应的body数据,例如请求网页时,其响应体为网页的HTML代码,请求图片时,其响应体为图片的二进制数据。

  爬虫请求一个网页后,要解析的内容就是响应体。

  在做爬虫的时候,我们主要是通过响应体获取网页的源代码、JSON数据等,然后从中提取相应的内容。

  2.2 网页基础 2.2.1 网页构成

  网页可以分为三个主要部分——HTML、CSS 和 JavaScript。**如果把网页比作一个人,HTML相当于骨架,JavaScript相当于肌肉,CSS相当于皮肤,三者结合可以形成一个完整的网页。

  HTML

  HTML是一种用来描述网页的语言,它的全称是Hyper Text Markup Language,即超文本标记语言。网页包括各种复杂的元素,如文本、按钮、图像和视频,它们的基础结构是 HTML。不同类型的文本由不同类型的标签表示。如果图片用img标签表示

  CSS

  CSS,全称是Cascading Style Sheets,即Cascading Style Sheets。“级联”是指当HTML中引用了多个样式文件且样式冲突时,浏览器可以按照级联顺序进行处理。“样式”是指网页中文字大小、颜色、元素间距、排列等的格式。例如:

  

  #head_wrapper.s-ps-islite .s-p-top {

position: absolute;

bottom: 40px;

width: 100%;

height: 181px;

}

  JavaScript

  JavaScript,简称 JS,是一种脚本语言。HTML 和 CSS 一起使用,只为用户提供静态信息,缺乏交互性。我们可能会在网页中看到一些交互和*敏*感*词*效果,比如下载进度条、提示框、轮播等,这通常是 JavaScript 的功劳。它的出现使用户和信息之间的问题不仅是浏览和显示的关系,而且实现了实时、动态、交互的页面功能。

  JavaScript 通常以单独文件的形式加载,后缀为 js,可以通过 HTML 中的 script 标签导入。

  例如:

  2.2.2 网页结构

  网页的标准形式是在 html 标签中嵌套 head 和 body 标签。网页的配置和引用在head中定义。网页的正文在正文中定义。

  

//指定网页编码

This is a Demo //网页标题

//正文部分

//网页中的区块

This is a Oemo

//负责网页的渲染

  得到app.js文件后,会执行其中的JavaScript代码,JavaScript会改变HTML中的节点,添加内容,最终得到完整的页面。

  但是当用 urllib 或 requests 等库请求当前页面时,我们得到的只是这段 HTML 代码,它不会帮助我们继续加载这个 JavaScript 文件,所以我们在浏览器中看不到内容。

  因此,使用基本的HTTP请求库得到的源代码可能与浏览器中的页面源代码不一样。对于这样的情况,我们可以分析一下它的后台Ajax接口。Selenium 和 Splash 等库也可用于模拟 JJavaScript 渲染。

  2.4 会话和 Cookie

  有的网站需要登录才能访问,登录后可以连续访问多次网站,但有时需要重新登录一次一段的时间。还有一些网站,打开浏览器就自动登录了,时间长了也不会失败,为什么呢?

  2.4.1 静态和动态网页

  动态网页不再是简单的HTML,可以用JSP、PHP、Python等语言编写,可以实现用户登录、注册等功能

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线