小村落落

博客园 首页 新随笔 联系 订阅 管理

初衷是想学机器学习,本来第一步应该是学习python的,因为我接触python已经很久了,都是自学的,用到什么去网上找例程直接拿来用,前几天又看了一些老师网上的直播课程,巩固了一下基础,印象深刻的是正则表达式,慢慢的开始对爬虫有了点了解,要处理数据首先要获取数据,这里对于模块的使用不做详细解释了,网上例子很多,主要是把走过的坑记录一下,下面是爬取豆瓣网数目的一个小栗子。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 12 11:21:25 2019

@author: lilide

"""
import requests
import re
 

try:
    fo = open('full.txt','w',encoding='utf-8')
    
    '''
    r = requests.get('https://book.douban.com')#.text
    print(r.status_code) 
    content = r.content.decode('utf-8')
    '''
    
    content = requests.get('https://book.douban.com/')
    #print(content.text)
    
    fo.write(content.text)
    
    pattern = re.compile('<li\s?class="">.*?="more-meta">\s?.*?"title">\s(.*?)\s<.*?class="author">\s(.*?)\s?</span>', re.S)

    results = re.findall(pattern, content.text)
    #print(results)
 
    for result in results:
        name,author = result
        author = re.sub('\s','',author)
        name = re.sub('\s','',name)
        print(name,'--'*5,author)

finally:
    fo.close#关闭文件

主要记录的地方有两个:

一个是编码格式:

fo = open('full.txt','w');上面代码编译的时候出现了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte seque对比了一下,应该f的编码格式是GBK的

fo = open('full.txt','w',encoding='utf-8');   

r = requests.get('https://book.douban.com')#.text

content = r.content.decode('utf-8')

另一个是正则表达式建立:pattern = re.compile('<li\s?class="">.*?="more-meta">\s?.*?"title">\s(.*?)\s<.*?class="author">\s(.*?)\s?</span>', re.S);

一直匹配不到,主要因为太心急,写正则表达式一定要确保你写出来的是对应的,可以找到的,对于这种长的表达式更是要细心。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 12 11:21:25 2019

@author: lilide

"""
import requests
from bs4 import BeautifulSoup

try:
    fo = open('full.txt','w',encoding='utf-8')  
    content = requests.get('https://book.douban.com/')
    fo.write(content.text)#写入文件

    soups = BeautifulSoup(content.text, 'lxml')
    author = soups.select('.more-meta .author')
    
    for i in author:
        print(i.string.strip())#去除空白字符

finally:
    fo.close#关闭文件

继续跟着学习了用BeautifulSoup抓取,真的是非常简单了,下面是结果。

runfile('C:/Users/lilide/tutorial/tutorial/spiders/untitled0.py', wdir='C:/Users/lilide/tutorial/tutorial/spiders')
(日)镝木莲
艾略特.温伯格
[日]荻原浩
[美]谭旋
[法] 莱蒂西娅·科隆巴尼
魏坤琳 / 陈虎平 / 等
余秀华
日本辰巳出版株式会社
[美]玛乔丽·刘 著 / [日]武田莎娜 绘
[日]小林一茶
[日]西川美和
高林
(日) 石黑亚矢子
东东枪
[日] 深水黎一郎
[日]蜷川幸雄
[日] 松本清张
章清
[加] 沙利文·纽威尔
[英] 蒂姆·斯佩克特
[法] 威尔弗里德·卢帕诺 编 / [意] 格雷戈里·帕纳乔内 绘
[英]詹姆斯•霍斯
远宁
[加]戴维·施密茨
[英] 萨拉·沃特斯
吴琦
残雪
[英] 大卫·汤姆森 (David Thomson)
郑辰
[美]艾米·里奇(Amy·Leach)
[日] 夏目漱石
[英] 杰里米·里德
[美]弗雷德里克·波尔
[日]夏目镜子 口述 / [日]松冈让 整理
[英] 朱利安·巴恩斯
[美]霍华德·马克斯
[日] 中岛敦
曾仁臻(鱼山饭宽)
[德] 雷马克
[法]西蒙娜·薇依
View Code

记录一下,主要是去除空白字符,一点点的学习,只有自己动手去实现才能越来越熟练。

下面是pyquery的操作,是对前段jquery的一种直观表达。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 12 11:21:25 2019

@author: lilide

"""
html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item<p>This is a paragraph.</p></span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq

doc = pq(html)
li = doc('.item-0.active')
print(li)

li.attr('name', 'link')#通过attr给标签添加和修改属性
print(li)#如果之前没有该属性则是添加,如果有则是修改

li.removeClass('active')#添加和删除属性
print(li)

li.addClass('active')#添加和删除属性
print(li)

li.find('p').remove()#通过remove就可以将无用的或者干扰的标签直接删除
print(li.text())
View Code

参考了coder大侠的博客,链接https://www.cnblogs.com/zhaof/p/6925674.html

posted on 2019-03-13 09:31  小村落落  阅读(125)  评论(0编辑  收藏  举报