Day-22 代理和css选择器解析库
-
获取代理ip
import requests def get_proxy_ips(): api = 'http://piping.mogumiao.com/proxy/api/get_ip_bs?appKey=3ee6f035175f4b508d8a825da0fb3833&count=4&expiryDate=0&format=2&newLine=3' response = requests.get(api) if response.status_code == 200: if response.text[0] == '{': print('获取代理失败, 提取太频繁') else: return response.text.split('\n')[:-1] else: print('请求失败') def get_net_data(): url = 'https://movie.douban.com/top250' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } # 代理 ips = get_proxy_ips() if ips: proxies = { 'http': ips[0], 'https' : ips[1] } response = requests.get(url, headers = headers, proxies=proxies, timeout = 2) if response.status_code == 200: print(response.text) else: print('数据请求失败!') else: print('没有成功获取到代理') if __name__ == '__main__': get_net_data()
-
bs4的使用
-
创建解析器对象
# 1. 创建解析器对象 # # BeautifulSoup(需要解析的html字符串, 解析器名称) # bs = BeautifulSoup(data, 'lxml')
-
根据css选择器获取标签
# 2. 根据css选择器获取标签 # select(css选择器) - 获取选择器选中的所有标签 # sekect_one(css选择器) - 获取选择器选中的第一个标签 result = bs.select('#p1') print(result)
-
获取标签内容
-
标签对线.string - 获取标签的文字内容(如果标签内容中有多个子标签,
或者同时存在文字和子标签时,结果是None) -
标签对象.get_text() - 获取标签的文字内容(如果有子标签, 会将子标签中的文字内容一起获取)
-
标签对象.contents - 获取标签中的文字和子标签, 返回值是列表
p1 = bs.select_one('div>p') print('string:', p1.string) print('text', p1.get_text()) print('contents', p1.contents) p p2 = bs.select_one('#p1') print('p2:', p2) print('p2-string:',p2.string) print('text:', p2.get_text()) print('contents', p2.contents) p3 = bs.select_one('.story') print('string', p3.string) # None print('text', p3.get_text())
-
-
获取标签属性
-
标签对象.attrs[属性名]
-
img = bs.select_one('img') print(img.attrs) print(img.attrs['src'])
-
-
在指定标签中获取子标签
- 标签对象.select(css选择器) - 获取指定标签中选择器选中的所有标签
- 标签对象.select_one(css选择器)- 获取指定标签中选择器选中的第一个标签
-
-
csv文件操作
-
创建一个writer
-
csv.writer(文件对象) - 以列表为单位写入一行数据
-
csv.DictWriter() - 以字典为单位写入一行数据
-
以列表提供数据
with open('files/test.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f)
-
写入数据
writer.writerow(['姓名', '性别', '年龄', '分数']) writer.writerows([ ['张三', '男', '15', '54'], ['李四', '女', '23', '65'], ['王五', '男', '17', '90'] ])
-
以字典提供数据
with open('files/test2.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, ['name', 'age', 'gender', 'score']) # 第一行内容 writer.writerow({'name':'姓名', 'age':'年龄', 'gender':'性别', 'score':'分数'}) # writer.writeheader() # 写一行 writer.writerow({'name':'张三', 'age':'56', 'gender':'男', 'score':'98'}) # 写多行 writer.writerows([ {'name':'张三1', 'age':'56', 'gender':'男', 'score':'98'}, {'name':'张三2', 'age':'56', 'gender':'男', 'score':'98'}, {'name':'张三3', 'age':'56', 'gender':'男', 'score':'98'} ])
-
读取csv文件内容
-
注意: 任意一个csv文件都可以选择使用列表或者字典的方式去读
-
一行数据对应一个列表
with open('files/test.csv', 'r', newline='', encoding='utf-8') as f: # reader就是每一行内容对应的迭代器. (reader是一个迭代器, 迭代器中的元素是每一行内容对应的列表) reader = csv.reader(f) # print(next(reader)) # print(next(reader)) # next(reader) # print(next(reader)) # print(list(reader))
-
一行数据对应一个字典
with open('files/test.csv', 'r', newline='', encoding='utf-8')as f: reader = csv.DictReader(f) print(reader.fieldnames) # ['姓名', '性别', '年龄', '分数'] print(next(reader)) # OrderedDict([('姓名', '张三'), ('性别', '男'), ('年龄', '15'), ('分数', '54')]) print(next(reader))
-
-
-
-