本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于凌晨安全,作者 MoLing

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对象的属性:

具体形式: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 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)

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

关于 .*? 的解释:

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.*?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数据

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('\n',',',result[0])
# print(str)
#方法二:
print(result[0].replace('/n',','))

0x02 爬取电影信息

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('\n', ','))
#print('\n')

0x03 爬取图片

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 data-original="(.*?)"')
results = re.findall(pattern,html_str)
print(results)
return results
#<img 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 线程池

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

"""线程池"""
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.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=20def 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_wordresponse = 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爬虫入门,详细讲解爬虫过程相关推荐

  1. python爬虫原理-python爬虫原理详细讲解

    原标题:python爬虫原理详细讲解 一 .爬虫是什么 1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. 2.互联网建立的目的?互联网的 ...

  2. 转 Python爬虫入门二之爬虫基础了解

    静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...

  3. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  4. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  5. 100个python算法超详细讲解:猴子吃桃

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...

  6. 100个python算法超详细讲解:黑白子交换

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 有3个白子和3个黑子如图7.1所示布置. 游戏的目的是用最少的步数将图7.1中白子和黑子的位置进行交 换,使得最终结果如图7.2所示. ...

  7. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  8. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  9. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  10. 100个python算法超详细讲解:谁是窃贼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...

最新文章

  1. 住手!!你不需要微服务!
  2. 跟着 Github 学习 Restful HTTP API 的优雅设计
  3. jquery实现全选、取消反选、加JavaScript三元运算(三种法法实现反选)
  4. 《犯罪心理学》读书笔记(part9)--犯罪心理的主观差异(下)
  5. 转载杨绛《一百岁感言》
  6. 你了解你的征信吗?这六个问题必须知道!
  7. springboot中使用servlet通过配置类
  8. 使用 Async / Await 来编写简明的异步代码
  9. wifi6无线网卡驱动linux,ROG R6E Omega换wifi 6无线网卡教程
  10. qtdesigner页面布局
  11. Java中将将JPG图片转GIF动画和将GIF转JPG图片
  12. 网页.php文件怎么运行,php文件怎么打开运行,浏览器访问php文件
  13. VS2017下载地址
  14. pypy+uwsgi+dango+nginx 简单部署
  15. selenium实现163邮箱自动登录
  16. Android 好看的登录界面
  17. 破解Excel的宏密码
  18. mysql工作原理学习
  19. Guided Image Filtering
  20. 【电路分享】基于8086投票器积分器系统设计、8086数码管数字钟计时器、8086密码锁可修改仿真、8086可控交通灯系统设计、8086流水灯系统设计、8086三位电压表电压采集仿真

热门文章

  1. 众享比特中标中电投电力工程有限公司区块链项目
  2. 芯片行业名词简写——来自实操小白经验积累1.0
  3. python为什么叫爬虫编程-Python是个什么鬼?为何周围的人都抢着学
  4. android 8(O)预装APP到data/app目录
  5. 汽车以太网技术及测试介绍
  6. RPA机器人是什么意思?RPA机器人能为企业解决哪些问题?
  7. 初探国产蓝牙软件SDK
  8. 广告业务系统 之 框架沉淀 —— “数据消费型服务框架”
  9. 超人微信投票v6.5.21
  10. s:select属性说明和用法介绍