Python学习之路爬虫

admin 2022年2月24日01:28:05评论44 views字数 9045阅读30分9秒阅读模式
爬虫的学习是超级有趣的啦,可以爬一些阔阔爱爱的小姐姐的照片(tips:得看看网站爬虫协议哟~)~如有问题请大佬多多指教,笔芯芯♥~

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_code

HTTP请求的返回状态(连接成功返回200;连接失败返回404)

r.text

HTTP响应内容的字符串形式,即:url对应的页面内容

r.encoding

从HTTP header中猜测的响应内容编码方式

r.apparent_encoding

从内容中分析出的响应内容编码方式(备选编码方式)

r.content

HTTP响应内容的二进制形式

    具体形式: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 requestsimport 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 href="https://movie.XX.com/subject/34961898/"  title="汉密尔顿">pattern = re.compile('<a.*?title="(.*?)">')     #  .*? 任意匹配尽可能多的匹配尽可能少的字符result = re.findall(pattern,html_str)print(result)


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

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

关于 .*? 的解释:

*

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

?

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

.

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

.*

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

.*?

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

(.*)

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

3. xpath解析源码

import requestsimport refrom bs4 import  BeautifulSoupfrom 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.*?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 resultsre_parse(html_str)bs4_parse(html_str)lxml_parse(html_str)

4. python写爬虫的架构

Python学习之路爬虫

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

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

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

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

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

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

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

0x01 whois爬取

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

"""whoishttp://whois.chinaz.com/sina.com"""import requestsimport reh = {'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('n',',',result[0])# print(str)#方法二:print(result[0].replace('/n',','))

0x02 爬取电影信息

"""爬取*眼电影前100电影信息"""import requestsimport reimport 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('n', ','))#print('n')

0x03 爬取图片

"""*精灵爬取练习 http://616pic.com/png/  ==》 http://XX.616pic.com/ys_img/00/06/20/64dXxVfv6k.jpg"""import requestsimport reimport time#数据的爬取img的urldef get_urls():response = requests.get('http://XX.com/png/')html_str = response.text#解析数据,得到urlpattern = re.compile('<img ')results = re.findall(pattern,html_str)print(results)return results#<img >#下载图片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 requestsimport reurl = 'https://www.toutiao.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&timestamp=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)

 

Python学习之路爬虫

'''美女爬取====方法二'''import requestsimport refrom urllib.parse import urlencode#https://www.toutiao.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
def get_urls(page): keys = { 'aid':'24', 'app_name':'web_search', 'offset':20*page, 'keyword':'美女', 'count':'20' } keys_word = urlencode(keys) url = 'https://www.toutiao.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 ThreadPoolExecutorimport timeimport threading
def 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 requestsimport refrom urllib.parse import urlencodeimport time
import threading#https://www.toutiao.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
def get_urls(page): keys = { 'aid':'24', 'app_name':'web_search', 'offset':20*page, 'keyword':'美女', 'count':'20' } keys_word = urlencode(keys) url = 'https://www.toutiao.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)

Python学习之路爬虫

0X06 tips--爬虫协议

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

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

User-agent: BaiduspiderDisallow: /baiduDisallow: /s?Disallow: /ulink?Disallow: /link?Disallow: /home/news/data/Disallow: /bhUser-agent: GooglebotDisallow: /baiduDisallow: /s?Disallow: /shifen/Disallow: /homepage/Disallow: /cproDisallow: /ulink?Disallow: /link?Disallow: /home/news/data/Disallow: /bh

tips:呐呐呐。。要遵守爬虫协议哟,只能在允许的范围内爬着玩儿哈~~~

   奉上所有python的学习资料(视频和编程语言api文档的链接),后台回复“python学习包”,即可获得啦~~~


本文始发于微信公众号(凌晨安全):Python学习之路----爬虫

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月24日01:28:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python学习之路爬虫http://cn-sec.com/archives/497426.html

发表评论

匿名网友 填写信息