res = requests.get()
- 以下的res都以此为基础
re模块的三个函数
- search() : 匹配并输出第一个匹配到的字符
- sub() : 替换
- findall() : 匹配生成列表
re.findall()匹配特点:
- 逐行匹配
- 匹配结果会生成一个列表
re模块修饰符
- re.S 匹配换行在内的所有字符
- re.I 对大小写不敏感
非贪婪匹配
- xx(.*?)xx : 把括号内匹配到的输出
- 缺点 : 无法匹配到换行符
res.content.decode('utf-8)
- 使用content输出的是二进制文件,这样就得有之后的解码过程decode
- 不过这样有一个好处就是兼容性好,不会出现乱码的症状
res.text
- 直接使用test将其转变成字符串形式,但有时会乱码
<p>(.*?)</p>
- 通常以上面这种形式抓取文字类信息
- 抓取到后记得要加回车符'\n'
res.status_code
- 返回执行requests.get的执行信息
\d
- 匹配一个数字,相当于[0-9]
\D
- 匹配一个非数字字符
\d+
- 匹配一个或者多个数字
\D+
- 匹配一个或者多个非数字字符
如何制造大量的有规律的url
- 利用列表生成式 ["www.baidubaoke{number}.com" for number in range(1, 10)]
如何同时处理多个列表
- for a, b, c in zip(as, bs, cs):
re.sub 与replace
- 两者都可用户字符串的替换
- 但是明显re.sub功能更为强大一些,利用正则的匹配功能可以随意替换一些东西
lxml库
- 此库需要依赖c语言环境,和Beautifulsoup相似
lxml库用法
- 修正html代码 etree.HTML(text)
- 读取html文件 etree.parse(filename)
- 解析html文件 etree.tostring(html_element)
如果数据类型为列表结果,如何从列表结构里面获取字符串类型数据
- 通过for循环依次打印,比如: for i in list1: print(i)
- 通过列表的切片获得列表内的字符串,比如: str1 = list1.[0]
直接利用xpath定位到是什么?
- 是element
如何将xpath定位到的element获取文字信息
- 在利用xpath定位的时候在xpath路径后加上: /text()
在使用xpath定位+/text()后,得到的数据是什么类型?
- 是列表
如何使用xpath定位循环点?
- 1.首先找到要定位的元素,然后往上去翻,直到找到一个大标签,一般找一个有class属性的大标签
- 2.定位循环点之后,抓取内容并用len查看元素个数,确认是否准确
学会变量赋值表达式
- comment = comments[0] if len(comments) != 0 else "空"
写入内容到csv表格
- 1.导入csv模块,import csv
- 2.定义一个writer,writer = csv.writer(filename)
- 3.调用writer写入内容,writer.row(('str1', 'string2'))
- 4.需要注意的是,写入的内容一定要是元祖格式,所以()里面还要有一个()
在写入中文到csv时乱码,怎样解决?
- 在使用open()打开文件的时候,在()里面加上 encoding='utf-8-sig'
写入内容到excel表格
- 导入xlwt模块
- 定义一个book book = xlwt.Workbook(encoding='utf-8')
- 定义一个sheet sheet = book.add_sheet('sheetname')
- 通过sheet写入内容 sheet.write(m, n, 'data') 这里m为行,n为列,都从0开始
- 保存为xls文件 book.save('filename')
- 注意写入技巧:可以利用多列表,外列表内包含的是整行内容,内列表包含的单个列的一个数据
json数据格式特点
- json数据是个字符串
- json数据里面是个字典
- json数据里面字典的元素可以对应一个列表,而列表又可以嵌入字典
- jsonstring = '{"user_man": [{"name": "Perter"}, {"name": "Anni"}], "user_woman": [{"name": "xiaoming"}, {"name": "zhangsan"}]}'
json数据解析
- 导入json库 import json
- 解析成json_data json_data = json.loads(jsonstring)
如何保存图片信息
- 需要找到真正的图片下载链接
- 需要把response变成byte内容
- 使用open创建文件操作 open(filename_path, 'wb')
- 写入图片内容 f.write(res.content)
- 退出文件 f.close()
如何插入数据到mongodb
- 安装pygongo模块并导入 import pymongo
- 创建数据库 mydb = pymongo.MongoClient('ip地址信息', '端口号')
- 创建表 test = mydb['表名']
- 插入数据 test.insert_one({集合A})
如何把mongodb表中的数据导出成csv格式
- 使用bin目录下的mongoexport工具
- 使用方法: mongoexport -d mydb -c test --csv -f name,sex,grade -o test.csv
- 相关参数解释: -d 数据库名称 -c 表名 -f 指定要导出的字段名 -o 导出的文件名
mongodb可视化管理工具
- Robomongo 3T
多进程处理
- 导入multiprocessing模块 import multiprocessing
- 创建多进程池 pool = multiprocessing.Pool(processes=2)
- 使用多进程池调用map pool.map(func, iterable)
何为异步处理
- 有些元素在html代码中看不到其存在,但仍在界面上显示,这种一般就采用了异步加载技术
- 切换界面后发现url并没有发生变化,像这种也是异步加载的表现
- 针对异步加载,需要打开浏览器network功能,点开XHR,然后操作网页会发现加载一些文件,点开这些文件可以查找到我们需要的信息
lxml代码
html代码
异步加载ajax的表现
- 点击一个页面的其他内容后,页面的url并没有发生变化
- 打开network选项后,下滑滚轮可以看到加载类似的文件,而文件内容恰好是滚轮下滑的内容
处理异步加载的动态网站
- 进行构造url,然后抓取内容
表单交互与模拟登陆
- 表单登陆需要编写post的内容 params = {'name':'13361012765','password':'123'} res = requests.post(url, data=params)
- 模拟登陆需要在headers中假如cookie headers={'cookie': 'xxxx'}
如何获取post表单的关键字段
- 在输入用户名密码的时候,打开浏览器network选项,然后故意输错用户名和密码,在加载的文件中找寻post请求
当response返回json数据时如何使用?
如何使用selenium配合写爬虫?
- 使用selenium操作网页
- 操作完之后使用.page_source获取html信息 html = browser.page_source
- 这个时候一般再使用etree.HTML去解析html文件
网友评论