大佬学习文章:http://c.biancheng.net/python_spider/re-module.html
一、re 模块和 csv 模块
1、re 模块
方法 | 参数介绍 / 用途 |
---|---|
re.compile (pattern,flags=0) | pattern:正则表达式;flags:代表功能标志位,扩展正则表达式的匹配。 flags=re.I|re.S,re.S 指可以匹配换行符 |
re.findall (pattern,string,flags=0) | string:目标字符串 |
regex.findall (string,pos,endpos) | pos: 截取字符串开始匹配位置;endpos 截取字符串结束匹配位置。 |
re.split (pattern,string,flags = 0) | 使用正则表达式匹配内容,切割目标字符串,返回值是切割后的内容列表。 |
re.sub (pattern,replace,string,max,flags = 0) | 使用一个字符串替换正则表达式匹配到的内容。返回值是替换后的字符串。 |
re.search (pattern,string,flags=0) | 匹配目标字符串第一个符合的内容,返回值为匹配的对象。 |
例:从 HTML 代码中使用 re 模块提取出两部影片的名称和主演信息
import re
html="""
<div class="movie-item-info">
<p class="name"><a title="你好,李焕英">你好,李焕英</a></p>
<p class="star">主演:贾玲,张小斐,沈腾</p></div>
<div class="movie-item-info">
<p class="name"><a title="刺杀,小说家">刺杀,小说家</a></p>
<p class="star">主演:雷佳音,杨幂,董子健,于和伟</p></div>
"""
pattern=re.compile('<div.*?<a title="(.*?)".*?star">(.*?)</p.*?div>',re.S)
r_list=pattern.findall(html)
print(r_list)
2、 csv 模块
方法 | 参数介绍 / 用途 |
---|---|
csv.writer (csvfile, dialect=‘excel’, fmtparams) | csvfile:必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象;dialect:编码风格,默认为 excel 的风格,也就是使用逗号,分隔;fmtparam:格式化参数,用来覆盖之前 dialect 对象指定的编码风格 |
csv.DictWriter (csvfile, fieldnames) | 以字典的形式写数据,fieldnames字段名,相当于key |
csv.reader (csvfile, dialect=‘excel’, fmtparams) | csvfile:必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象;dialect:编码风格,默认为 excel 的风格,也就是使用逗号,分隔;fmtparam:格式化参数,用来覆盖之前 dialect 对象指定的编码风格 |
csv.DictReader() | 以字典的形式读数据 |
writerow () | 单行写入,列表格式传入数据 |
writerrows() | 多行写入 |
import csv
# 操作文件对象时,需要添加newline参数逐行写入,否则会出现空行现象
with open('names.csv', 'w', newline='') as csvfile:
#构建字段名称,也就是key
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# 写入字段名,当做表头
writer.writeheader()
# 多行写入
writer.writerows([{'first_name': 'Baked', 'last_name': 'Beans'},{'first_name': 'Lovely', 'last_name': 'Spam'}])
# 单行写入
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
二、Pymysql实现数据存储
在 import pymysql 的时候 报错 import pymysql ModuleNotFoundError: No module named ‘pymysql’
解决办法:打开cmd -> pip install pymysql -> 找到 site-packages 安装路径 -> 在 pycharm 里面 interpreter paths 设置添加 -> 重新运行
在进行运行的时候报错:pycharm连接数据库出现‘pymysql.err.DataError: (1366,
查到是编码字符集的问题,我自作主张在创建数据库的时候将括号里面的去掉了,罪该万死
CREATE DATABASE maoyandb (CHARSET utf8);
# -*-coding:utf-8-*-
import pymysql
db = pymysql.connect(host='localhost',user='root',password='xxx',database='maoyandb')
'''创建cursor对象'''
cursor = db.cursor()
'''sql语句执行,列表元组'''
info_list = [('我不是药神','徐峥','2018-07-05'),('你好,李焕英','贾玲','2021-02-12')]
sql = 'insert into filmtab values(%s,%s,%s)'
'''executemany() 可以同时插入多条数据'''
cursor.executemany(sql,info_list)
db.commit()
cursor.close()
db.close()
成功!
三、Requests库
方法 | 参数介绍 / 用途 |
---|---|
requests.request() | 构造一个请求对象,该方法是实现以下各个方法的基础 |
requests.get (url,headers=headers,params,timeout,verify=False) | GET 请求,表示向网站发起请求,获取页面响应对象。url:要抓取的 url 地址。headers:请求头信息。params:请求时携带的查询字符串参数。timeout:超时时间,超过时间会抛出异常。verify=False,SSL认证参数,false 表示不会认证 |
requests.post (url,data={请求体的字典}) | POST 请求,先由用户向目标 url 提交数据,然后服务器返回一个 HttpResponse 响应对象 |
requests.head() | 获取HTML网页头信息的方法,对应于 HTTP 的 HEAD 方法 |
requests.put() | 获取HTML网页提交PUT请求方法,对应于 HTTP 的 PUT |
requests.patch() | 获取HTML网页提交局部修改请求,对应于 HTTP 的 PATCH |
requests.delete() | 获取HTML页面提交删除请求,对应于 HTTP 的 DELETE |
爬取一张 Python log 图片保存在本地
import requests
url = 'xxx'
#简单定义浏览器ua信息
headers = {'User-Agent':'Mozilla/4.0'}
#读取图片需要使用content属性
html = requests.get(url=url,headers=headers).content
#以二进制的方式下载图片
with open('C:/xxx/Desktop/img/python_logo.jpg','wb') as f:
f.write(html)