python爬虫(含scrapy)
python爬虫
1.解析HTML:
lxml 是一种python编写的库,可以迅速、灵活的处理xml和html
使用:根据版本的不同,有如下两种:
-
形式1:
from lxml import etree
转换成树形结构对象:
obj=etree.HTML(htmlStr)
-
形式2:
from lxml import html
getHtml=requests.get(url,headers=header)
htmlObj=html.fromstring(getHtml.content.decode("utf8"))
htmlObj.xpath("")
a、xpath语法:
表达式 | 说明 |
---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
@ | 选取属性 |
. | 选择当前节点 |
节点名 | 1选取此节点所有子节点 |
//book | 选取所有book子元素,而不管它们在文档中的位置 |
div//book | 选择属性div元素的后代的所有book元素,而不管它们位于div之下的什么位置 |
//@lang | 选取名为lang的所有属性 |
b、举例
路径表达式 | 结果 |
---|---|
/div/div[1] | 选取数据div元素的第一个div元素 |
/div/div[last()] | 选取属于div元素的最后一个div元素 |
/div/div[last()-1] | 选取属于div元素的倒数第二个div元素 |
/div/div[position() < 3] | 选取最前面的两个属于div元素的子元素的book元素 |
//title[@lang] | 选取所有拥有名为lang属性的title元素 |
//title[@lang='eng'] | 选取所有lang属性值为eng的title元素 |
2.解析json
import json
str='{"result":0,"data":[{"id":"664","numbers":"42235"}],"msg":"\u6210\u529f"}'
obj=json.loads(str)
xxrs=obj['data'][0]['numbers']
print(xxrs)#结果:42235
3.正则表达式
菜鸟教程:https://www.runoob.com/python/python-reg-expressions.html
正则表达式:
字符 | 描述 |
---|---|
[…] | 用来表示一组字符, 单独列出, 例如, [amk]匹配a, m或k |
[^…] | 不在[]中的字符, 例如, [^abc]匹配除了a, b, c之外的字符 |
* | 匹配0个或多个的表达式 |
+ | 匹配1个或者多个的表达式 |
? | 匹配0个或1个由前面的正则表达式定义的片段, 非贪婪方式 |
精确匹配n次前面的表示 | |
匹配n到m次由前面的正则表达式定义的片段, 贪婪模式 | |
a|b | 匹配a或者b |
( ) | 匹配括号内的表达式, 也表示一个组 |
实例 | 描述 |
---|---|
[Pp]ython | 匹配 "Python" 或 "python" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配中括号内的任意一个字母 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 除了aeiou字母以外的所有字符 |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
---|---|
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
a.常用方法:
- re.findall()
使用案例:
import re
a="声明:python是一门简单的语言!python是一门好用的语言!"
#findall() 返回数据为list格式
result=re.findall("python(.*)!",a)# ['是一门简单的语言!python是一门好用的语言']
result2=re.findall("python(.*?)!",a)#['是一门简单的语言','是一门好用的语言']
# (.*)贪婪匹配,会尽可能的往后匹配
# (.*?) 非贪婪匹配,会尽可能少的匹配,是否加?影响匹配结果的长度
4.scrapy使用步骤:
- 新建文件夹(scrapyPro)存放scrapy文件
- 到scrapyPro目录下,执行:scrapy startproject scrapyOne
- 进入到scrapyOne下的spiders目录执行:scrapy genspider 爬虫名称 xxx.com
- 用编码工具修改settings.py 中的robots 设置为false
- 修改爬虫程序代码
- 运行爬虫:scrapy crawl 爬虫名称
a.scrapy使用小知识
-
Settings.py文件介绍:
项目名:BOT_NAME = ‘xxxx‘
遵循ROBOT协议:ROBOTSTXT_OBEY = False
用户身份:USER_AGENT =‘xxxx’
最大并发数:CONCURRENT_REQUESTS=32默认为16
下载延迟:DOWNLOAD_DELAY = 3
每个域名最大并发数:CONCURRENT_REQUESTS_PER_DOMAINCookie设置:COOKIES_ENABLED默认为true,下次请求带上cookie
默认请求头设置:DEFAULT_REQUEST_HEADERS一系列中间件、缓存、http请求的配置等(不常用)
-
爬虫项目的工程目录及各个组成的作用:
scrapy.cfg:项目配置文件。
settings.py:项目设置文件。pipelines.py:项目管道文件,主要用于对
Items定义的数据进行加工与处理。
middlewares.py:项目的中间件文件。
items.py:项目的数据容器文件,用于定义获取的数据。
init.py:初始化文件。
spiders目录:爬虫目录,例如,创建文件、编写爬虫解析规则等
b.数据存储的四种格式
-
以txt文本形式存储:
class xxxxPipeline: def __init__(self): self.file=open("test.txt","w",encoding="utf8") def process_item(self,item,spider): row='{},{},{},{}\n'.format(item['name'], item['age'],item['zy'],item['dy']) self.file.write(row) return item def close(self): self.file.close()
-
CSV格式
import csv class xxxxPipeline: def __init__(self): self.file = open('../moot2.csv','a',encoding='utf-8',newline='') self.writer = csv.writer(self.file,delimiter=';') self.writer.writerow(['表头1','表头2',.....]) def process_item(self,item,spider): self.writer.writerow([item['title'],item['price'],......]) return item def close(self): self.file.close()
-
json格式:
import json class xxxxPipeline: def __init__(self): self.file = open('../moot2.json','a',encoding='utf-8') def process_item(self,item,spider): jsonstr = json.dumps(dict(item),ensure_ascii=False) self.file.write(jsonstr+'\n') return item def close(self): self.file.close()
-
mysql存储
import pymysql class xxxxPipeline: def __init__(self): self.conn = pymysql.connect(host='IP/localhost', user='root',password='123456', port=3306,db='数据库名') self.cursor = self.conn.cursor() def process_item(self,item,spider): sql = "insert into tb_moot values(null,%s,%s,......)" self.cursor.execute(sql,(item['title'],item['price'],.......)) self.conn.commit() return item def close(self): self.cursor.close() self.conn.close()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本