Python爬虫学习笔记(2)-单线程爬虫

来源:互联网 发布:淘宝上下架工具 编辑:程序博客网 时间:2024/05/17 23:23

Python爬虫学习笔记(2)-单线程爬虫

标签(空格分隔): python 爬虫 单线程


概要

  • Requests介绍
  • 网页爬虫
  • 向网页提交数据
  • 实战–极客学院课程爬虫

1.Requests介绍

  • [x] Requests:HTTP for Humans(第三方库,实现python的网络连接)
  • [x] 完美的替代Python的urllib2模块
  • [x] 更多的自动化
  • [x] 更友好的用户体验
  • [x] 更完善的功能

1)urllib2模块

目标网址:’https://api.github.com’

import urllib2gh_url = 'http://api.github.com'req = urllib2.Request(gh_url)password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()password_manager.add_password(None, gh_url, 'user', 'pass')auth_manager = urllib2.AbstractBasicAuthHandler(password_manager)opener = urllib2.build_opener(auth_manager)urllib2.install_opener(opener)handler = urllib2.urlopen(req)print handler.getcode()print handler.headers.getheader('content-type')

2)使用requests模块

# -*- coding: utf-8 -*-import requestsr = requests.get('https://api.github.com', auth=('user', 'pass'))print r.status_codeprint r.headers['content-type']

2.第一个网页爬虫

  • 用requests提取网页源代码
  • 用正则表达式匹配内容

1)提取源代码

  • 在一些情况下直接获取
  • 修改http头获取源代码

a.直接获取

import requestshtml = requests.get('http://tieba.baidu.com/f?ie=utf-8&kw=python')print html.text

requests.get()获取网页源代码
.text输出内容

b.修改http头

有些情况下网站对访问进行检查,阻止爬虫requests的访问,所以需要更改http头,作用是让爬虫伪装成浏览器从让网站通过访问。

语法:

  • 添加语句:(变量名) = {‘User-Agent’:”}

User-Agent的内容通过:右键->审核元素->NetWork->刷新网页->任意选择一项->Headers->在Request Headers中找到User-Agent

  • 在requests.get()中添加headers = 变量名

eg.

headers = {'User-Agent':'...'}html = requests.get('...', headers = headers)

2)提取内容

找到自己所需的内容的规律用正则表达式匹配。

3.向网页提交数据

  • Get和Post介绍
  • 分析目标网站
  • Requests的表单提交

1)Get和Post介绍

  • Get是从服务器上获取数据
  • Post是从服务器传送数据,并返回所传送的值
  • Get通过构造url中的参数来实现功能
  • Post将数据放在header提交数据

2)分析目标网站

目标:https://www.crowdfunder.com/browse/deals
使用:Chrome-审核元素-Network

import requestsimport reurl = 'http://www.crowdfunder.com/browse/deals'html = requests.get(url).textprint html

发现在点击异步加载项后,提取不了新增内容

3)Requests表单提交

核心方法:requests.post
核心步骤:构造表单-提交表单-获取返回信息

对于使用异步加载技巧的网站,get只能获取部分信息,所以使用Post

import requestsimport reurl = 'http://www.crowdfunder.com/browse/deals&template=false'data = {    'entitles_only':'true',    'page':'1'}html_post = requests.post(url, data=data)title = re.findall('"card-title">(.*?)</div>', html_post.text, re.S)for each in title:    print each
  • page所对应的值为异步页数,初始页为1

3.实战–极客学院课程爬虫

  • 目标网站:http://www.jikexueyuan.com/course/
  • 目标内容:前20页的课程名称,课程介绍,课程时间,课程等级,学习人数
  • 涉及知识:Requests获取网页,re.sub换页,正则表达式匹配内容

爬虫只能获取到我们能看到的东西

# -*- coding: utf-8 -*-import requests, re, sysreload(sys)sys.setdefaultencoding("utf-8")class spider(object):    def __init__(self):        print u'开始爬取内容。。。'    def getsource(self, url):        html = requests.get(url)        return html.text    def changepage(self, url, total_page):        now_page = int(re.search('pageNum=(\d+)', url, re.S).group(1))        page_group = []        for i in range(now_page, total_page+1):            link = re.sub('pageNum=\d+','pageNum=%s'%i, url, re.S)            page_group.append(link)        return page_group    def geteveryclass(self, sourse):        everyclass = re.findall('(<li deg="".*?</li>)', sourse, re.S)        return everyclass    def getinfo(self, eachclass):        info = {}        info['title'] = re.search('target="_blank">(.*?)</a>', eachclass, re.S).group(1)        info['content'] = re.search('</h2><p>(.*?)</p>', eachclass, re.S).group(1)        timeandlevel = re.findall('<em>(.*?)</em>', eachclass, re.S)        info['classtime'] = timeandlevel[0]        info['classlevel'] = timeandlevel[1]        info['learnnum'] = re.search('learn-number">(.*?)</em>', eachclass, re.S).group(1)        return info    def saveinfo(self, classinfo):        f = open('info.txt', 'a')        for each in classinfo:            f.writelines('title:' + each['title'] + '\n')            f.writelines('content:' + each['content'] + '\n')            f.writelines('classtime:' + each['classtime'] + '\n')            f.writelines('classlevel:' + each['classlevel'] + '\n')            f.writelines('learnnum:' + each['learnnum'] + '\n\n')        f.close()if __name__ == '__main__':    classinfo = []    url = 'http://www.jikexueyuan.com/course/?pageNum=1'    jikespider = spider()    all_links = jikespider.changepage(url,20)    for link in all_links:        print u'正在处理页面:' + link        html = jikespider.getsource(link)        everyclass = jikespider.geteveryclass(html)        for each in everyclass:            info = jikespider.getinfo(each)            classinfo.append(info)    jikespider.saveinfo(classinfo)

作者:Skyeyes
日期:2015.11.19
说明:本文根据极客学院Python定向爬虫入门整理总结

0 0