Python 爬虫

Posted 暴走的二萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 爬虫相关的知识,希望对你有一定的参考价值。

Requests urllib的升级版本打包了全部功能并简化了使用方法
beautifulsoup 是一个可以从HTML或XML文件中提取数据的Python库.
LXML 一个HTML解析包 用于辅助beautifulsoup解析网页

urllib2用一个Request对象来映射你提出的HTTP请求。
在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,
通过调用urlopen并传入Request对象,将返回一个相关请求response对象,
这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。

百度贴吧小爬虫
目的:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数。
功能:下载对应页码内的所有页面并存储为html文件。

 1 import urllib2
 2 import string 
 3 
 4 def baidu_tieba(url,begin_page,end_page):
 5     for i in range(begin_page,end_page):
 6         sName = string.zfill(i,5)+.html
 7         print is downloading  + str(i) + page and restore it as + sName + ......
 8         f=open(sName,w+)
 9         m=urllib2.urlopen(url+str(i)).read()
10         f.write(m)
11         f.close()
12 
13 bdurl = "http://tieba.baidu.com/p/4989517604?pn="
14 begin_page = 1
15 end_page = 5
16 
17 baidu_tieba(bdurl,begin_page,end_page)

 

查看workspace,我们可以看到
技术分享图片

技术分享图片

这样一个一个的页面就被我们保存到本地啦!!真的很简单很开心啊!!!

re模块
使用re的一般步骤是:
Step1:先将正则表达式的字符串形式编译为Pattern实例。
Step2:然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)。
Step3:最后使用Match实例获得信息,进行其他的操作。

用户代理 User Agent,是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好。
如何查看chrome的用户代理信息?
在地址栏中输入:chrome://version/ 即可显示全部信息

1 用户代理    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

 

出现 SyntaxError: Non-ASCII character ‘xef’ in file hello.py on line 10, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details问题时很明显是编码的问题,那么就在.py文件头添加一句
#coding:utf-8

便可以解决问题。

小技能:f12+fn 快速调出审查元素

糗事百科

 1 # coding:utf-8
 2 import urllib2
 3 import urllib
 4 import re
 5 page = 1 
 6 url = http://www.qiushibaike.com/hot/page/+str(page)
 7 user_agent = Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
 8 headers = {User-Agent : user_agent}
 9 try:
10     request = urllib2.Request(url,headers = headers)
11     response = urllib2.urlopen(request)
12     content  = response.read()
13     pattern = re.compile(h2>(.*?)</h2.*?content">(.*?)</.*?number">(.*?)</,re.S)
14     items = re.findall(pattern,content)
15     for item in items:
16         print item[1],item[2]
17 
18 except urllib2.URLError,e:
19     if hasattr(e,"code"):
20         print e.code
21     if hasattr(e,"reason"):
22         print e.reason
23 
24 # 打印出第一页的html code,这里使用headers是伪装成浏览器,防止被封,有的网站需要这样的
25 # 措施,否则会报出httplib.BadStatusLine: ‘‘这样的错误,有的则没有被封的风险。
26 
27 #2.提取某一页的所有段子
28 #1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。
29 
30 #2)(.*?)代表一个分组,在这个正则表达式中我们匹配了三个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。
31 
32 #3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。
33 #这样我们便获得了发布内容 点赞数

 

Quotes 一个hin简单的网站!
经过一天的摸鱼之旅之后终于要开始学习scrapy框架啦,毕竟干写爬虫和用框架写一定是不一样的。
看了一些基础scrapy教程之后爬了一个结构很简单的网站,但是还没有保存,其中有些东西还不是很懂。

 1 import scrapy 
 2 
 3 
 4 class Myspider(scrapy.Spider):
 5 
 6     name = hello
 7 
 8     def start_requests(self):
 9        urls=[
10        http://quotes.toscrape.com/page/1/,
11        http://quotes.toscrape.com/page/2/,
12        ]
13        for url in urls:
14            yield scrapy.Request(url=url,callback=self.parse) 
15 
16 
17     def parse(self, response):
18         # page = response.url.split("/")[-2]
19         # filename = ‘quotes-%s.html‘ % page
20         # with open(filename,‘wb‘) as f:
21         #     f.write(response.body)
22         # self.log(‘Saved file %s‘ % filename)
23         content = response.xpath(".//div[@class=‘quote‘]/span[1]/text()").extract()
24         for i in content: 
25             print i 

 

技术分享图片
上面的一个引号便是一条条的quote啦,超级简单啦~

2017/5/20 愉快的节日~心情很好所以想学一下Mysql在python中的应用。
1)#!/usr/bin/python
是用来说明脚本语言是Python的。是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。

2)#-- coding: utf-8 --
是用来指定文件编码为utf-8的。

我搜索了一下“# -- coding:utf-8 -- 为什么要这样的格式?”,有人在下面回复说:“大概是颜文字?”萌到我了!其实应该是Emacs处理编码的方式。在sublime里面我们输入# coding:urf-8也是没有问题的啦~

连接mysql数据库

  • 到mysql5.7/bin/下输入,以进入数据库:
  • 1 mysql -hlocalhost -uroot -p
    显示数据库内容:
  • 1 SHOW DATABASES;
    创建数据库:
  • 1 CREATE DATABASE testdb;
    创建一个’testuser’的测试用户,并予以相应的权限:
  • 1 CREATE USER testuser@localhost IDENTIFIED BY test623;
    使用数据库:
  • 1 mysql> USE testdb;
    grant 权限 on 数据库对象 to 用户,赋予权限给用户
  • 1 mysql> GRANT ALL ON testdb.* TO testuser@localhost;
    退出
 1 mysql> quit;
 2 #!user/bin/python
 3 # coding:utf-8
 4 # print mysql version
 5 import MySQLdb as mdb
 6 import sys
 7 con = None
 8 try:
 9     con = mdb.connect(localhost,testuser,test623,testdb)
10     # 主机名 用户名 密码 数据库
11     cur = con.cursor()
12     # 创建游标
13     cur.execute("SELECT VERSION()")
14     data = cur.fetchone()
15     print "database version:%s " %data
16 except mdb.Error,e:
17     print "error %d: %s" %(e.args[0],e.args[1])
18 finally:
19     if con:
20         con.close()

 

便打印出数据库的版本:

1 database version:5.7.17-log

 

2.新建表并插入数据
我们先来看看SQL建表语句

 1 create table userinfo 
 2 
 3 ( 
 4   id int primary key identity,--identity每次自动加1
 5   name char(20), 
 6   age int check(age>10), 
 7   sex char(2) 
 8 )
 9 
10 --插入
11 insert into userinfo(name,age,sex) values(张三,24,)

 

tip:运行python时每次弹出“IndentationError: unindent does not match any outer indentation level”就说明tab and blank又混用啦!不得不说这一点真麻烦呢。

 1 # coding: utf-8
 2 import MySQLdb as mdb
 3 import sys
 4 
 5 con = mdb.connect(localhost, testuser, test623, testdb);
 6 with con:
 7     cur = con.cursor()
 8     cur.execute("CREATE TABLE IF NOT EXISTS Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))")
 9     cur.execute("INSERT INTO Writers(Name) VALUES(‘Jack London‘)")
10     cur.execute("INSERT INTO Writers(Name) VALUES(‘Honore de Balzac‘)")
11     cur.execute("INSERT INTO Writers(Name) VALUES(‘Lion Feuchtwanger‘)")
12     cur.execute("INSERT INTO Writers(Name) VALUES(‘Emile Zola‘)")
13     cur.execute("INSERT INTO Writers(Name) VALUES(‘Truman Capote‘)")

 

3.提取表中数据

 1 # coding: utf-8
 2 import MySQLdb as mdb
 3 import sys
 4 
 5 con = mdb.connect(localhost, testuser, test623, testdb);
 6 with con:
 7     cur = con.cursor()
 8     cur.execute("SELECT * FROM Writers")
 9     rows = cur.fetchall()
10     #get all the data from the table and put it in a list
11     for row in rows:
12         print row
13 C:pythonworkspace>python haha.py
14 (1L, Jack London)
15 (2L, Honore de Balzac)
16 (3L, Lion Feuchtwanger)
17 (4L, Emile Zola)
18 (5L, Truman Capote)

 

以上是关于Python 爬虫的主要内容,如果未能解决你的问题,请参考以下文章

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段

python爬虫学习笔记-M3U8流视频数据爬虫

爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

python网络爬虫

Python 利用爬虫爬取网页内容 (div节点的疑惑)

为啥我的python爬虫界面与博主不一样