机器学习集训营---第二周总结

本周重点是python写爬虫程序,是个复杂的一周,要把上周学会的python基础应用到实际程序中。课程密度 很大,三次线上课,三次训练课,周日一次线下课,现在在回上海的火车上写周总结。
主要内容:

  1. 使用requests抓取静态网页数据以及解析数据
  2. 实现模拟登录和分布式爬虫
  3. selenium使用以及mysql和redies数据库操作网页动态内容获取

其实在上午上课的时候我就想到可以用分布式爬虫写一个服务,抓取个大网站健康频道的新闻内容,后面又讲到了scrapy框架,就更加坚定了我的想法,写一个app就叫“健康头条”先做ios客户端,服务端就用python写,所有的数据都是从别的网站上抓取的,没有编辑。一是巩固了学习内容作了练习,二是做一个自己的产品。
下面围绕主要内容仔细回顾下这一周所讲的知识点:

  1. 使用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中出现空格的时候,用点代替
  2. 实现模拟登录和分布式爬虫
    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上线程和进程开销差不多
  3. 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很明显是正确的选择

获取数据有两种途径,一种是别人给你一批数据,另一种是自己去抓数据。大多数情况都是需要我们自己去抓数据,而且自己需要什么数据只有自己知道,别人难给出你正好想要的数据,所以学习好爬虫非常重要,下周抽出时间要继续深入练习爬虫。

你可能感兴趣的:(机器学习集训营---第二周总结)