Python爬虫学习记录(0)——Python 爬虫抓站 记录(虾米,百度,豆瓣,新浪微博)

python 下用到的库,urllib, urllib2, BeautifulSoup, cookielib, mechanize, re

看Firebug模拟浏览器行为。

1. 虾米

虾米不用登陆,没有IP限制,最简单。Python抓了下Xiami电台的试听数 里用的是

import urllib2

content = urllib2.urlopen('http://www.xiami.com/artist/top/id/1234').read()

每个歌手爬个两三页。把试听数10000以上的歌记下来。歌手id大概有11w。

处理网页用split, 正则表达式re.compile, BeautifulSoup都成。

( Beautiful Soup的中文文档 http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html )

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(content)

就能对soup操作了,支持正则表达式,譬如

soup.find('p', align=re.compile('^b.*'))['id']可以从 <p id="secondpara" align="blah"> 中抓出 secondpara, 可以通过这个抓到a href=""中间的url

soup.find("b", { "class" : "lime" })可以抓到 <b class="lime">Lime</b>

soup.find("b", { "class" : "lime" }).string 可以提取到<>与</>中间的内容 Lime。

2. 百度

如果想在空间里取米粒之类的操作就要登陆,mechanize比较好用。

import mechanize
import cookielib

# Browser
br = mechanize.Browser()

# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

 

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
r = br.open('https://passport.baidu.com/?login&tpl=mn')

br.select_form(nr=0)
br.form['username']='abcabcabc' #用户名
br.form.find_control("password").readonly = False
br.form['password']='123123123' #密码
br.submit()

然后可以试试开个百度窗口看看自己的用户名在不在网页里

content = br.open('http://www.baidu.com').read()

print 'cwyalpha' in content

3. 新浪微博

新浪微博的登陆很麻烦。网上有很多模拟SinaSSO登陆的做法,比如

http://chen.yi.bo.blog.163.com/blog/static/15062110920120151191189/

http://denger.iteye.com/blog/1039052

http://community.itbbs.cn/thread/19120/

http://blog.csdn.net/xiaojianpitt/article/details/6440561

问题是SinaSSO的版本变化太快,半年前的登陆代码现在就不管用了。

之前主要爬新浪微群的用户,基本没有IP和访问数限制,可以直接把firefox的cookie抓过来用。用sqlite2cookie

def sqlite2cookie(filename):
    from cStringIO import StringIO
    from pysqlite2 import dbapi2 as sqlite
    con = sqlite.connect(filename)
    cur = con.cursor()
    cur.execute("select host, path, isSecure, expiry, name, value from moz_cookies")
    ftstr = ["FALSE","TRUE"]
    s = StringIO()
    s.write("""\
# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This is a generated file!  Do not edit.
""")
    for item in cur.fetchall():
        s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (
            item[0], ftstr[item[0].startswith('.')], item[1],
            ftstr[item[2]], item[3], item[4], item[5]))
    s.seek(0)
    cookie_jar = cookielib.MozillaCookieJar()
    cookie_jar._really_load(s, '', True, True)
    return cookie_jar

 

之后

cookiejar = sqlite2cookie(r'C:\Documents and Settings\a\Application Data\Mozilla\Firefox\Profiles\8mi38ldc.default\cookies.sqlite') #ff profile下的cookie地址
br = mechanize.Browser()
# Browser options
br.set_cookiejar(cookiejar)

爬微群的用户用到ajax,是POST方法。

r = br.open('http://q.weibo.com/ajax/members/page',
                        urllib.urlencode({'page':str(page),'gid':gid}),
                        timeout=30).read()

搜索是这样

searchq = '韩寒' #文件开头用utf8(# -*- coding:utf-8 -*-)
r = br.open('http://s.weibo.com/weibo/' + urllib.quote(searchq)).read()

新浪搜索限制是10s一个请求,单IP可以10个用户同时搜,最多返回50页,但可以把时间限制在某天某个小时内,所以基本够用。

4. 豆瓣

抓豆瓣短评不用登陆,但是手机版豆瓣单IP访问太多会封禁。网页版豆瓣单cookie单IP抓一小时就会让输验证码,可以用三个cookie轮流抓(三个都不用登陆)

上面的sqlite2cookie()函数是把整个cookie发出去,也可以把特定域名的cookie发出去

def sqlite2cookiehost(filename,host):
    con = sqlite.connect(filename)
    con.text_factory = str
    cur = con.cursor()
    cur.execute("select host, path, isSecure, expiry, name, value from moz_cookies where host like ?"
            ,['%%%s%%' % host])
    ftstr = ["FALSE","TRUE"]
    s = StringIO()
    s.write("""\
# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This is a generated file! Do not edit.
""")
    for item in cur.fetchall():
        s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (
            item[0], ftstr[item[0].startswith('.')], item[1],
            ftstr[item[2]], item[3], item[4], item[5]))
    s.seek(0)
    cookie_jar = cookielib.MozillaCookieJar()
    cookie_jar._really_load(s, '', True, True)
    return cookie_jar

调用

cookiejar = sqlite2cookiehost(r'C:\Documents and Settings\a\Application Data\Mozilla\Firefox\Profiles\8mi38ldc.default\cookies.sqlite', 'douban')

Chrome的cookie调用

def sqlite2cookieChrome(filename):#filename
   #from pysqlite2 import dbapi2 as sqlite
 
 ## but we can make sqlite3 always return bytestrings ...
 # Cookies file come from C:\Users\JiangHonglei\AppData\Local\Google\Chrome\User Data\Default\Cookies
   con = sqlite3.connect(filename)
   con.text_factory = str
   
   cur = con.cursor()
   #cur.execute("select host, path, isSecure, expiry, name, value from moz_cookies")
   cur.execute("select host_key, path, secure, expires_utc, name, value from cookies")
   
   ftstr = ["FALSE","TRUE"]
 
   s = StringIO()
   s.write("""\
# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This is a generated file!  Do not edit.
""")
   for item in cur.fetchall():
      try:
         s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (
             item[0], ftstr[item[0].startswith('.')], item[1],
             ftstr[item[2]], item[3], item[4], item[5]))
      except UnicodeError:
            continue
   s.seek(0)
 
   cookie_jar = cookielib.MozillaCookieJar()
   cookie_jar._really_load(s, '', True, True)
   return cookie_jar

之后

cookiejarChrome = sqlite2cookieChrome(r'C:\Documents and Settings\a\Local Settings\Application Data\Google\Chrome\User Data\Default\Cookies')

IE的cookie比较特殊,每个域名的cookie分开存放,直接读取不能,从Temporary Internet Files里找到cookie拷出来用。。



cookiejarIE = mechanize.MSIECookieJar(delayload=True)
cookiejarIE.load_cookie_data(r'F:\BJ1KF314.txt')
5. 备注

爬豆瓣短评时碰到一些问题,比如碰到这种评论就会有utf8编码无法读取的错误


读内容的时候加ignore或者replace的参数,更多解释可以看u2b上watch?v=sgHbC6udIqc 这个视频

response = br.open(nextpageurl, timeout = 20)
content = response.read()
content = content.decode('utf-8','ignore')

最好在抓网页的时候加 except (urllib2.URLError, IOError): 排错,某些无法抓取的情况可能是网站把IP封了,另一种情况是这个页面真的是不存在。。。比如 见过大爷 这片子是没有评论没有打分的。。

mechanize和BeautifulSoup在处理之后最好手工清理下,否则内存占用会越来越大,

当网页不需要使用时要把mechanize的历史记录清了,br.clear_history()

BeautifulSoup存的内容用完最好也清掉,soup.decompose()

不清除历史记录很有可能爬1000个网页内存就要耗掉1G。。



  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 使用pyquery可以通过CSS选择器或XPath表达式来查找HTML文档中的元素,从而提取所需的数据。具体步骤如下: 1. 导入pyquery库:`from pyquery import PyQuery as pq` 2. 加载HTML文档:`doc = pq(html)` 3. 使用CSS选择器或XPath表达式查找元素:`doc('selector')`或`doc.xpath('xpath_expression')` 4. 提取元素的文本内容、属性值等数据:`element.text()`或`element.attr('attribute_name')` 例如,假设我们要从以下HTML文档中提取所有链接的URL地址: ```html <html> <body> <a href="https://www.baidu.com">百度</a> <a href="https://www.google.com">谷歌</a> <a href="https://www.bing.com">必应</a> </body> </html> ``` 可以使用以下代码实现: ```python from pyquery import PyQuery as pq html = ''' <html> <body> <a href="https://www.baidu.com">百度</a> <a href="https://www.google.com">谷歌</a> <a href="https://www.bing.com">必应</a> </body> </html> ''' doc = pq(html) links = doc('a') # 使用CSS选择器查找所有<a>元素 for link in links: url = pq(link).attr('href') # 提取<a>元素的href属性值 print(url) ``` 输出结果为: ``` https://www.baidu.com https://www.google.com https://www.bing.com ``` ### 回答2: Python爬虫是目前互联网上非常常见的一种数据采集方式,通过Python程序代码模拟人类浏览器行为,从目标网站上自动抓取所需数据。爬虫数据提取方式有很多种,其中比较流行的一种方式就是使用pyquery查找元素。 pyquery是Python的一种强大的解析html和xml文档的库,它采用了jQuery风格的语法,对于提取数据非常方便快捷。下面我们来介绍pyquery的用法。 1. 安装pyquery库:使用pip命令可以很方便地安装pyquery库,如下所示: ``` pip install pyquery ``` 2. 导入pyquery库:在Python程序代码中导入pyquery库,如下所示: ``` from pyquery import PyQuery as pq ``` 3. 初始化pyquery对象:通过url或html文本初始化pyquery对象,如下所示: 通过url初始化: ``` doc = pq(url='http://www.baidu.com') ``` 通过html文本初始化: ``` html = ''' <html> <head> <title>python爬虫数据提取方式——使用pyquery查找元素</title> </head> <body> <div class="content" id="content-div"> <p>这是一个示例文本</p> </div> </body> </html> ''' doc = pq(html) ``` 4. 查找元素:使用find、children、siblings等方法查找元素,如下所示: 查找元素: ``` p = doc('p') ``` 查找元素属性值: ``` div_id = doc('#content-div').attr('id') ``` 5. 获取元素内容:使用text、html方法获取元素内容,如下所示: 获取文本内容: ``` p_text = p.text() ``` 获取html内容: ``` div_html = doc('#content-div').html() ``` 总之,pyquery是Python爬虫数据提取中很实用的一种工具,通过它可以快速方便地获取到所需数据。在使用pyquery时,需要了解基础的HTML语法,并掌握pyquery中的各种查找、遍历和属性操作方法。 ### 回答3: Python爬虫数据提取方式之一是使用pyquery查找元素。Pyquery是一个Python库,它是在jQuery的基础上构建的,可以用来解析和操作HTML文档。使用Pyquery可以方便快捷地从网页中提取需要的数据。 使用Pyquery查找元素的过程分为以下几步: 第一步是获取网页源代码。通常情况下,可以使用Python Requests库获取网页源代码,并将其保存为一个字符串类型的变量。 第二步是使用Pyquery构建doc对象。使用Pyquery的from_string()方法可以将网页源代码转换为Pyquery类型的对象。 第三步是通过选择器选取元素。类似于使用jQuery选择器选取元素一样,使用Pyquery的find()方法和eq()方法可以选取需要的元素。 第四步是获取元素的属性或文本值。使用Pyquery的attr()方法可以获取元素的属性值,text()方法可以获取元素的文本值。 最后是对获取的数据进行处理和存储。可以使用Python的各种数据处理和存储工具对获取的数据进行处理和存储,例如使用Pandas库进行数据分析和处理,使用MySQL或MongoDB等数据库进行数据存储。 总之,使用Pyquery查找元素是Python爬虫重要的数据提取方式之一,通过选取网页中需要的元素,并获取其属性或文本值,可以快速而准确地抓取数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cwyalpha

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值