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

本周重点是python写爬虫程序,是个复杂的一周,要把上周学会的python基础应用到实际程序中。课程密度 很大,三次线上课,三次训练课,周日一次线下课,现在在回上海的火车上写周总结。
主要内容:
  1. 使用requests抓取静态网页数据以及解析数据
  2. 实现模拟登录和分布式爬虫
  3. selenium使用以及mysql和redies数据库操作网页动态内容获取

其实在上午上课的时候我就想到可以用分布式爬虫写一个服务,抓取个大网站健康频道的新闻内容,后面又讲到了scrapy框架,就更加坚定了我的想法,写一个app就叫“健康头条”先做ios客户端,服务端就用python写,所有的数据都是从别的网站上抓取的,没有编辑。一是巩固了学习内容作了练习,二是做一个自己的产品。
下面围绕主要内容仔细回顾下这一周所讲的知识点:
  1. 使用requests抓取静态网页数据以及解析数据
    1. requests用法:
      1. 获取网页内容,一行代码:r = requests.get(url)
      2. 获取本次请求的状态 r.status_code (200成功 ,404找不到页面.....)
      3. 获取返回内容的编码格式 r.encoding (有的编码格式不对的需要转码)
      4. 获取返回内容 r.text
      5. 设置发送请求的headers:r = requests.get(url, headers={'user-agent':ua})
      6. user-agent可以伪装成浏览器发送的请求
      7. 设置cookies :r = requests.get(url, cookies=cookies, headers=headers)
      8. cookies里有保存了登录状态,比如在浏览器中登录了豆瓣,然后查看源代码,把cookies拷贝出来,然后设置这个cookies,就相当于登录状态发送这个请求
      9. 设置自定义参数:r = requests.get("http://httpbin.org/get", params={'key1':'Android', 'key2':'iOS'})
      10. allow_redirects = False 不允许重定向

    2. BeautifulSoup用法: (用来在返回的网页数据定位到想要的内容,并取出来)
      1. 类名前加点
      2. id前加#号
      3. 标签不用加修饰符
      4. 层级之间用 > 来连接,中间要加空格
      5. 根据css定位筛选出来一个list的代码:
        1. s = BeautifulSoup(r.text, BSLIB)
        2. items = s.select('div.prod-list > div')
        3. items是一个list,即使只有一条数据,也是一个list
        4. 当class中出现空格的时候,用点代替
  2. 实现模拟登录和分布式爬虫
    1. 进程:
      1. 子进程崩溃了,主进程和其他子进程不影响,继续工作
      2. 主进程崩溃了,子进程不影响,继续工作
      3. 适合相互独立的,分隔的干净的任务,稳定性很高
      4. 创建一个进程:Process(target=run_proc, args=('hello', 'world'))
      5. 创建进程池:
        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()
      6. 创建进程队列:
        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()
    2. 线程:
      1. 某一个子线程崩溃, 直接把整个线程都拖垮了
      2. mac和linux上线程和进程开销差不多
  3. selenium使用以及mysql和redies数据库操作网页动态内容获取
    1. Selenium用法:
      1. 模拟浏览器真人操作
      2. 避免被封ip
      3. 安装webdriver,chorme是其中一种
      4. 实现自动打开浏览器,并输入药房网的网址,并搜索关键词‘感冒’最后点击搜索,这一套流程的代码:
        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()
      5. chrome 去掉“该网站的安全证书不受信任”的提示的代码
        1. options.add_argument('--ignore-certificate-errors')
      6. 接受从外部接受到的参数例如 : python3 hello.py sqc
        1. sys.argv[1] 这样可以接受到sqc这个参数
    2. xpath使用:
      1. etree
      2. select.xpath(' ')
      3. xpath:
        1. 先找到你要的节点
        2. //表示全局去搜
        3. .//表示从节点开始查找
        4. . 表示从当前节点
        5. 去属性,用@取
        6. 标签和标签之间用 / 指向下一级
        7. 用xpath找到的是一个list,即使只有一个元素,也是list,取[0]
        8. 取标签中的属性,用 .get('src')
      4. xpath返回是一个list,即使只有一个元素,也是list

上午弄清楚了一个概念:yield和return
yield : 生成器 ,一个函数中可以用yield返回一个循环的数据,其实相当于返回一个生成器,而不是把所有的结果返回,这样效率更高,当索引到20的时候就取20的数据,相当于一个游标,来回游动取值。
return:直接返回所有数据和结果
如果取大量数据的数组时用yield很明显是正确的选择


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





















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙启超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值