本周重点是python写爬虫程序,是个复杂的一周,要把上周学会的python基础应用到实际程序中。课程密度 很大,三次线上课,三次训练课,周日一次线下课,现在在回上海的火车上写周总结。
主要内容:
- 使用requests抓取静态网页数据以及解析数据
- 实现模拟登录和分布式爬虫
- selenium使用以及mysql和redies数据库操作网页动态内容获取
其实在上午上课的时候我就想到可以用分布式爬虫写一个服务,抓取个大网站健康频道的新闻内容,后面又讲到了scrapy框架,就更加坚定了我的想法,写一个app就叫“健康头条”先做ios客户端,服务端就用python写,所有的数据都是从别的网站上抓取的,没有编辑。一是巩固了学习内容作了练习,二是做一个自己的产品。
下面围绕主要内容仔细回顾下这一周所讲的知识点:
- 使用requests抓取静态网页数据以及解析数据
a. requests用法:
i. 获取网页内容,一行代码:r = requests.get(url)
ii. 获取本次请求的状态 r.status_code (200成功 ,404找不到页面.....)
iii. 获取返回内容的编码格式 r.encoding (有的编码格式不对的需要转码)
iv. 获取返回内容 r.text
v. 设置发送请求的headers:r = requests.get(url, headers={'user-agent':ua})
vi. user-agent可以伪装成浏览器发送的请求
vii. 设置cookies :r = requests.get(url, cookies=cookies, headers=headers)
viii. cookies里有保存了登录状态,比如在浏览器中登录了豆瓣,然后查看源代码,把cookies拷贝出来,然后设置这个cookies,就相当于登录状态发送这个请求
ix. 设置自定义参数:r = requests.get("http://httpbin.org/get", params={'key1':'Android', 'key2':'iOS'})
x. allow_redirects = False 不允许重定向
xi.
b. BeautifulSoup用法: (用来在返回的网页数据定位到想要的内容,并取出来)
i. 类名前加点
ii. id前加#号
iii. 标签不用加修饰符
iv. 层级之间用 > 来连接,中间要加空格
v. 根据css定位筛选出来一个list的代码:
1. s = BeautifulSoup(r.text, BSLIB)
2. items = s.select('div.prod-list > div')
3. items是一个list,即使只有一条数据,也是一个list
4. 当class中出现空格的时候,用点代替 - 实现模拟登录和分布式爬虫
a. 进程:
i. 子进程崩溃了,主进程和其他子进程不影响,继续工作
ii. 主进程崩溃了,子进程不影响,继续工作
iii. 适合相互独立的,分隔的干净的任务,稳定性很高
iv. 创建一个进程:Process(target=run_proc, args=('hello', 'world'))
v. 创建进程池:
1. p = Pool(cpu_count())
2. for i in range(500):
3. p.apply_async(run_proc, args=(i, ))
4. p.close()
5. p.join()
vi. 创建进程队列:
1. q = Queue()
2. for i in range(100):
3. q.put(i)
4. p_1 = Process(target=run_proc, args=(q, )
5. p_2 = Process(target=run_proc, args=(q, ))
6. p_1.start()
7. p_2.start()
8. p_1.join()
9. p_2.join()
b. 线程:
i. 某一个子线程崩溃, 直接把整个线程都拖垮了
ii. mac和linux上线程和进程开销差不多 - selenium使用以及mysql和redies数据库操作网页动态内容获取
a. Selenium用法:
i. 模拟浏览器真人操作
ii. 避免被封ip
iii. 安装webdriver,chorme是其中一种
iv. 实现自动打开浏览器,并输入药房网的网址,并搜索关键词‘感冒’最后点击搜索,这一套流程的代码:
1. driver = webdriver.Chrome()
2. driver.get("http://www.yaofangwang.com/")
3. driver.find_element_by_id('keyword').send_keys('感冒')
4. driver.find_element_by_id('btn_submit').click()
v. chrome 去掉“该网站的安全证书不受信任”的提示的代码
1. options.add_argument('--ignore-certificate-errors')
vi. 接受从外部接受到的参数例如 : python3 hello.py sqc
1. sys.argv[1] 这样可以接受到sqc这个参数
b. xpath使用:
i. etree
ii. select.xpath(' ')
iii. xpath:
1. 先找到你要的节点
2. //表示全局去搜
3. .//表示从节点开始查找
4. . 表示从当前节点
5. 去属性,用@取
6. 标签和标签之间用 / 指向下一级
7. 用xpath找到的是一个list,即使只有一个元素,也是list,取[0]
8. 取标签中的属性,用 .get('src')
iv. xpath返回是一个list,即使只有一个元素,也是list
上午弄清楚了一个概念:yield和return
yield : 生成器 ,一个函数中可以用yield返回一个循环的数据,其实相当于返回一个生成器,而不是把所有的结果返回,这样效率更高,当索引到20的时候就取20的数据,相当于一个游标,来回游动取值。
return:直接返回所有数据和结果
如果取大量数据的数组时用yield很明显是正确的选择
获取数据有两种途径,一种是别人给你一批数据,另一种是自己去抓数据。大多数情况都是需要我们自己去抓数据,而且自己需要什么数据只有自己知道,别人难给出你正好想要的数据,所以学习好爬虫非常重要,下周抽出时间要继续深入练习爬虫。
网友评论