当前位置:首页 > 网络安全 > 正文内容

Python研究之爬虫练习

访客4年前 (2021-04-14)网络安全1040

本仙女回来啦,阔别已久,分外想念。前天的一次应急响应学到很多内网知识,还认识了很多大厂小哥。对学技术的男孩儿有种天生的好感,比心比心~

呐,今天复习一下爬虫,给你们分享我爬的美女小姐姐。要是文章有错误,小哥哥小姐姐请私聊我。

0x00 爬虫前期准备

1. 爬虫就是模拟浏览器抓取东西,爬虫三部曲:数据爬取、数据解析、数据存储

数据爬取:手机端、pc端数据解析:正则表达式数据存储:存储到文件、存储到数据库

2. 相关python库

爬虫需要两个库模块:requests和re

1. requests库

requests是比较简单易用的HTTP库,相较于urllib会简洁很多,但由于是第三方库,所以需要安装,文末附上安装教程链接(链接全在后面,这样会比较方便看吧,贴心吧~)

requests库支持的HTTP特性:

保持活动和连接池、Cookie持久性会话、分段文件上传、分块请求等

Requests库中有许多方法,所有方法在底层的调用都是通过request()方法实现的,所以严格来说Requests库只有request()方法,但一般不会直接使用request()方法。以下介绍Requests库的7个主要的方法:

①requests.request()

构造一个请求,支撑一下请求的方法

具体形式:requests.request(method,url,**kwargs)

method:请求方式,对应get,post,put等方式

url:拟获取页面的url连接

**kwargs:控制访问参数

②requests.get()

获取网页HTM网页的主要方法,对应HTTP的GET。构造一个向服务器请求资源的Requests对象,返回一个包含服务器资源的Response对象。

Response对象的属性:

属性说明r.status_codeHTTP请求的返回状态(连接成功返回200;连接失败返回404)r.textHTTP响应内容的字符串形式,即:url对应的页面内容r.encoding从HTTP header中猜测的响应内容编码方式r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)r.contentHTTP响应内容的二进制形式

具体形式:res=requests.get(url)

code=res.text? ? (text为文本形式;bin为二进制;json为json解析)

③requests.head()

获取HTML的网页头部信息,对应HTTP的HEAD

具体形式:res=requests.head(url)

④requests.post()

向网页提交post请求方法,对应HTTP的POST

具体形式:res=requests.post(url)

⑤requests.put()

向网页提交put请求方法,对应HTTP的PUT

⑥requests.patch()

向网页提交局部修改的请求,对应HTTP的PATCH

⑦requests.delete()

向网页提交删除的请求,对应HTTP的DELETE

"""requests 操作练习"""
import requests
import re
#数据的爬取
h={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response=requests.get('https://movie.douban.com/chart',headers=h)
html_str=response.text
#数据解析<a class="nbg" href="https://movie.XX.com/subject/34961898/"? title="汉密尔顿">
pattern=re.compile('<a class="nbg".*?title="(.*?)">')? ? ?#? .*? 任意匹配尽可能多的匹配尽可能少的字符
result=re.findall(pattern,html_str)
print(result)

2. re正则表达式:(Regular Expression)

一组由字母和符号组成的特殊字符串,作用:从文本中找到你想要的格式的句子

关于 .*? 的解释:

*? ? 匹配前面的子表达式零次或多次。例如,zo能匹配“z”以及“zoo”。等价于{0,}。

? 匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

.? ? ?匹配除“ ”之外的任何单个字符。要匹配包括“ ”在内的任何字符,请使用像“(.

.*? ?具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。

.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质(尽可能匹配少的字符但是要匹配出所有的字符)。

(.*) 是贪婪匹配代表尽可能多的匹配字符因此它将h和l之间所有的字符都匹配了出来

3. xpath解析源码

import requests
import re
from bs4 import? BeautifulSoup
from lxml import etree
#数据爬取(一些HTTP头的信息)
h={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response=requests.get('https://movie.XX.com/chart',headers=h)
html_str=response.text
#数据解析
#正则表达式解析
def re_parse(html_str):
pattern=re.compile('<a class="nbg".*?title="(.*?)"')
results=re.findall(pattern,html_str)
print(results)
return results
#bs4解析
def bs4_parse(html_str):
soup=BeautifulSoup(html_str,'lxml')
items=soup.find_all(class_='nbg')
for item in items:
print(item.attrs['title'])
#lxml解析
def lxml_parse(html_str):
html=etree.HTML(html_str)
results=html.xpath('//a[@class="nbg"]/@title')
print(results)
return results
re_parse(html_str)
bs4_parse(html_str)
lxml_parse(html_str)

4. python写爬虫的架构

从图上可以看到,整个基础爬虫架构分为5大类:爬虫调度器、URL管理器、HTML下载器、HTML解析器、数据存储器。

下面给大家依次来介绍一下这5个大类的功能:

① 爬虫调度器:主要是配合调用其他四个模块,所谓调度就是取调用其他的模板。

② URL管理器:就是负责管理URL链接的,URL链接分为已经爬取的和未爬取的,这就需要URL管理器来管理它们,同时它也为获取新URL链接提供接口。

③ HTML下载器:就是将要爬取的页面的HTML下载下来。

④ HTML解析器:就是将要爬取的数据从HTML源码中获取出来,同时也将新的URL链接发送给URL管理器以及将处理后的数据发送给数据存储器。

⑤ 数据存储器:就是将HTML下载器发送过来的数据存储到本地。

0x01 whois爬取

每年,有成百上干万的个人、企业、组织和政府机构注册域名,每个注册人都必须提供身份识别信息和联系方式,包括姓名、地址、电子邮件、联系电话、管理联系人和技术联系人一这类信息通常被叫做whois数据

"""
whois
http://whois.chinaz.com/sina.com
"""
import requests
import re
h={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response=requests.get('http://whois.chinaz.com/'+input("请输入网址:"),headers=h)
print(response.status_code)
html=response.text
#print(html)
#解析数据
pattern=re.compile('class="MoreInfo".*?>(.*?)</p>',re.S)
result=re.findall(pattern,html)
# 方法一:
# str=re.sub(' ',',',result[0])
# print(str)
#方法二:
print(result[0].replace('/n',','))

0x02 爬取电影信息

"""爬取*眼电影前100电影信息"""
import requests
import re
import time
# count=[0,10,20,30,40,50,60,70,80,90]
h={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
responce=requests.get('https://XX.com/board/4?offset=0', headers=h)
responce.encoding='utf-8'
html=responce.text
# 解析数据? time.sleep(2)
patter=re.compile('class="name">.*?title="(.*?)".*?主演:(.*?)</p>.*?上映时间:(.*?)</p>', re.S)
#time.sleep(2)
result=re.findall(patter, html)
print(result)
with open('maoyan.txt', 'a', encoding='utf-8') as f:
for item in result:? # 读取result(以元组的形式储存)中的内容=》
for i in item:
f.write(i.strip().replace(' ', ','))
#print(' ')

0x03 爬取图片

"""*精灵爬取练习 http://616pic.com/png/?==》 http://XX.616pic.com/ys_img/00/06/20/64dXxVfv6k.jpg"""
import requests
import re
import time
#数据的爬取img的url
def get_urls():
response=requests.get('http://XX.com/png/')
html_str=response.text
#解析数据,得到url
pattern=re.compile('<img class="lazy" data-original="(.*?)"')
results=re.findall(pattern,html_str)
print(results)
return results
#<img class="lazy" data-original="http://XX.616pic.com/ys_img/00/06/20/64dXxVfv6k.jpg">
#下载图片
def down_load_img(urls):
for url in urls:
response=requests.get(url)
with open('temp/'+url.split('/')[-1], 'wb') as f:
f.write(response.content)
print(url.split('/')[-1],'已经下载成功')
if __name__=='__main__':
urls=get_urls()
down_load_img(urls)

0x04 爬取小仙女

'''头条美女爬取====方法一'''import requests
import re
url='https://www.XX.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&amptimestamp=1596180364628&_signature=-Bv0rgAgEBA-TE0juRclmfgatbAAKdC7s6ktYqc7u9jLqXOQ5SBCDkd25scxRvDydd6TgtOw0B7RVuaQxhwY1BwV89sPbdam8LkNuV08d0QfrZqQ4oOOrOukEJ1qxroigLT'
response=requests.get(url)
print(response.status_code)
html_str=response.text
#解析"large_image_url":"(.*?)"
pattern=re.compile('"large_image_url":"(.*?)"')
urls=re.findall(pattern,html_str)
print(urls)def down_load(urls):
for url in urls:
response=requests.get(url)
with open('pic/'+url.split('/')[-1],'wb') as f:
f.write(response.content)
print(url.split('/')[-1],'已经下载成功')
if __name__=='__main__':
down_load(urls)
'''头条美女爬取====方法二'''import requests
import re
from urllib.parse import urlencode
#https://www.XX.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20def get_urls(page):
keys={
'aid':'24',
'app_name':'web_search',
'offset':20*page,
'keyword':'美女',
'count':'20'
}
keys_word=urlencode(keys)
url='https://www.XX.com/api/search/content/?'+keys_word
response=requests.get(url)
print(response.status_code)
html_str=response.text
# 解析"large_image_url":"(.*?)"
pattern=re.compile('"large_image_url":"(.*?)"',re.S)
urls=re.findall(pattern, html_str)
return urls#下载图片
def download_imags(urls):
for url in urls:
response=requests.get(url)
with open('pic/'+url.split('/')[-1]+'.jpg','wb') as f:
f.write(response.content)
print(url.split('/')[-1]+'.jpg',"已下载~~")if __name__=='__main__':
for page in range(3):
urls=get_urls(page)
print(urls)
download_imags(urls)

0x05 线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。

"""线程池"""from concurrent.futures import ThreadPoolExecutor
import time
import threadingdef ban_zhuang(i):
print(threading.current_thread().name,"**开始搬砖{}**".format(i))
time.sleep(2)
print("**员工{}搬砖完成**一共搬砖:{}".format(i,12**2)) ? #将format里的内容输出到{}if __name__=='__main__': ? ? ? ? ? ? #主线程
start_time=time.time()
print(threading.current_thread().name,"开始搬砖")
with ThreadPoolExecutor(max_workers=5) as pool:
for i in range(10):
p=pool.submit(ban_zhuang,i)
end_time=time.time()
print("一共搬砖{}秒".format(end_time-start_time))

结合多线程的爬虫:

'''头条美女爬取'''import requests
import re
from urllib.parse import urlencode
import timeimport threading
#https://www.XX.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20def get_urls(page):
keys={
'aid':'24',
'app_name':'web_search',
'offset':20*page,
'keyword':'美女',
'count':'20'
}
keys_word=urlencode(keys)
url='https://www.XX.com/api/search/content/?'+keys_word
response=requests.get(url)
print(response.status_code)
html_str=response.text
# 解析"large_image_url":"(.*?)"
pattern=re.compile('"large_image_url":"(.*?)"',re.S)
urls=re.findall(pattern, html_str)
return urls#下载图片
def download_imags(urls):
for url in urls:
try:
response=requests.get(url)
with open('pic/'+url.split('/')[-1]+'.jpg','wb') as f:
f.write(response.content)
print(url.split('/')[-1]+'.jpg',"已下载~~")
except Exception as err:
print('An exception happened: ')
if __name__=='__main__':
start=time.time()
thread=[]
for page in range(3):
urls=get_urls(page)
#print(urls)
#多线程
for url in urls:
th=threading.Thread(target=download_imags,args=(url,))
#download_imags(urls)
thread.append(th)
for t in thread:
t.start()
for t in thread:
t.join()end=time.time()
print('耗时:',end-start)

0X06 tips--爬虫协议

Robots协议,又称作爬虫协议,机器人协议,全名叫做网络爬虫排除标准(Robots Exclusion Protocol),是用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取,通常为一个robots.txt文本文件,一般放在网站的根目录下。

Robots协议:在网页的根目录+/robots.txt? 如www.baidu.com/robots.txt

User-agent: Baiduspider Disallow: /baidu Disallow: /s? Disallow: /ulink? Disallow: /link? Disallow: /home/news/data/ Disallow: /bh User-agent: Googlebot Disallow: /baidu Disallow: /s? Disallow: /shifen/ Disallow: /homepage/ Disallow: /cpro Disallow: /ulink? Disallow: /link? Disallow: /home/news/data/ Disallow: /bh

tips:要遵守爬虫协议哟,呐。。只能用于爬着玩儿哈~~~记得挂代理~~~(文中的链接我都改过啦,想练手的私聊我,或者自己找链接吧。。。挺好玩儿的啦)

0x07 相关链接

requests的安装与使用? ? https://www.jianshu.com/p/140012f88f8e

re的使用说明? ? https://www.cnblogs.com/vmask/p/6361858.html

其他的爬虫相关文章? ? https://blog.csdn.net/qq_27297393/article/details/81630774

爬虫的视频? ? https://www.imooc.com/learn/563

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:https://therlest.com/106124.html

分享给朋友:

“Python研究之爬虫练习” 的相关文章

创业板投资风险揭示书,创业板风险揭示书

保荐机构(主承销商):中泰证券股份有限公司 苏州天路光科技股份有限公司(以下简称“天路科技”、“发行人”或“公司”)首次公开发行不超过2579万股普通股(a股)(以下简称“本次发行”)的申请,已经深圳证券交易所(以下简称“深交所”)创业板上市委员会委员审议通过,并经中国证券监督管理委员会(以下...

干洗对衣物有害吗

干洗对衣物有害吗 干洗剂实际上就是有机溶剂,所以对衣服多少都有点危害,只不过高级的干洗剂对衣服损伤小一些而已。 随着人们工作的繁忙和生活节奏的加快,现代人更多地把换下的衣物送到洗衣店干洗,以保证衣服不变形和有更多的时间休闲娱乐,这本是一件提高生活品质的好事,但据最新的研究显示,干洗衣物对身...

福田小货车新车价格 「福田小卡之星3柴油版」

另一种是祥锐3360-490动力的。去二手车.发动机带涡轮增压方向助力国四3点.单排货厢3米7长,如果你不上高速,柴油车,刘巷有卖的,应该属于准新车,3W8-4W4左右。 福田时代小卡之星3全柴485」该车子才不到一年车龄,国四的价格要比这个贵1万多,不进市区的话,厢式货车贵5千元.国IV的轻卡价格...

Webshell安全检测篇(1)-根据流量的检测方法

一、概述 笔者一直在重视webshell的安全剖析,最近就这段时刻的心得体会和咱们做个共享。 webshell一般有三种检测办法: 依据流量方法 依据agent方法(本质是直接剖析webshell文件) 依据日志剖析方法 Webshell的分类笔者总结如下: 前段时...

一年黄金价格走势图(黄金价格实时走势图分析

2019年金价将迎来上涨荷兰银行,2018年黄金市场或许不会有太好的表现,是一种软的,你可以随时来平台内查询。 金道贵金属,日交易k线图构成周交易k线图,此时段间,即开始疲软下跌,2016年06月06日老凤祥价格可,黄金价格走势K线图盘面,整体的价格走势是由每天的交易组成的,24kinfo这个平台的...

黄埔燃料油现货价格_今日燃料油市场价格

这句话是指期货比现货价格高100元吗,柴油,1%的权重都没有,通过技术指标和消息面影响来分析的。有的有点差,点88 国际燃料油收盘价涨跌新加坡。244点5 国内燃料油,燃料油,作为成品油的一种,屈居第二位,有的高点有的低一点,2。97#汽油5点38元/价格升,在原油的加工过程中,常关注的消息为OPE...

评论列表

慵吋邶谌
2年前 (2022-06-07)

toload=true&count=20def get_urls(page):keys={'aid':'24','app_name':'web_search','offset':20*page,'keyword':'美女','c

冬马空宴
2年前 (2022-06-07)

外的任何单个字符。要匹配包括“”在内的任何字符,请使用像“(..*? ?具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质(尽可能

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。