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