爬虫代码集

一、简单爬取猫眼(使用字符串)

import json

import requests
import re


# 返回页面
def get_page(url):
    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.content.decode('utf-8')
    return None


# 选择抓取内容
def parse_page(html):
    # 主演
    pattern = re.compile('<p class="star">(.*?)</p>', re.S)
    actor_items = re.findall(pattern, html)

    # 电影名
    pattern = re.compile('movieId.*?>.*?<img.*?<img.*?alt="(.*?)" class.*?', re.S)
    title_items = re.findall(pattern,html)
    # 上映时间
    pattern = re.compile('<p class="releasetime">(.*?)</p>',re.S)
    time_items = re.findall(pattern,html)
    # 排名
    pattern = re.compile('<i class="board-index.*?">(.*?)</i>', re.S)
    rank_items = re.findall(pattern, html)
    # 图片链接
    # pattern = re.compile('movieId.*?>.*?<img.*?<img.*?src="(.*?)"',re.S)
    # items = re.findall(pattern,html)
    movies = []
    for i in range(len(actor_items)):
        one_movie = {}
        one_movie['title'] = title_items[i]
        one_movie['actor'] = actor_items[i].strip()[3:]
        one_movie['time'] = time_items[i].strip()[5:]
        one_movie['rank'] = rank_items[i]
        movies.append(one_movie)

    return movies


# 写入文件
def write_img(url):
    arr = url.split('@')
    filename = arr[0].split('/')[-1]

    with open('./images/%s' % filename, 'wb') as f:
        headers = {
            "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
        }
        response = requests.get(url, headers=headers)
        f.write(response.content)


# 输出抓取内容
def main():
    # 猫眼网址
    urls = ['http://maoyan.com/board/4?offset=0',
            'http://maoyan.com/board/4?offset=10',
            'http://maoyan.com/board/4?offset=20',
            'http://maoyan.com/board/4?offset=30',
            'http://maoyan.com/board/4?offset=40',
            'http://maoyan.com/board/4?offset=50',
            'http://maoyan.com/board/4?offset=60',
            'http://maoyan.com/board/4?offset=70',
            'http://maoyan.com/board/4?offset=80',
            'http://maoyan.com/board/4?offset=90', ]
    for url in urls:
        html = get_page(url)
        movies = parse_page(html)

        str = json.dumps(movies, ensure_ascii=False)
        with open('a.json', 'a', encoding='utf-8') as f:
            f.write(str)

        for item in movies:
            print(item)
        #     write_img(item.strip())

        # print(html)
        # print(items)


if __name__ == '__main__':
    main()

二、简单爬取豆瓣(使用XPATH)

import requests
from lxml import etree


# 取页面HTML


def get_one_page():
    url = "https://www.douban.com/group/explore/culture"
    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        text = response.content.decode('utf-8')
        return text
    return None


# 解析页面
def parse_with_xpath(html):
    etree_html = etree.HTML(html)
    # print(etree_html)

    # 匹配所有节点 //*
    # result = etree_html.xpath('//*')
    # print(result)
    # print(len(result))

    # 匹配所有子节点 //a     文本获取:text()
    # result = etree_html.xpath('//a/text()')
    # print(result)

    # 查找元素子节点 /
    # result = etree_html.xpath('//div/p/text()')
    # print(result)

    # 查找元素所有子孙节点 //
    # result = etree_html.xpath('//div[@class="channel-item"]//h3/a/text()')
    # print(result)

    # 父节点 ..
    # result = etree_html.xpath('//span[@class="pubtime"]/../span/a/text()')
    # print(result)

    # 属性匹配 [@class="xxx"]
    # 文本匹配 text() 获取所有文本//text()
    result = etree_html.xpath('//div[@class="article"]//text()')
    print(result)

    # 属性获取 @href
    # result = etree_html.xpath('//div[@class="article"]/div/div/@class')[0]
    # # result = etree_html.xpath('//div[@class="bd"]/h3/a/@href')
    # print(result)

    # 属性多值匹配 contains(@class 'xx')
    # result = etree_html.xpath('//div[contains(@class, "grid-16-8")]//div[@class="likes"]/text()[1]')
    # print(result)

    # 多属性匹配 or, and, mod, //book | //cd, + - * div = != < > <= >=
    # result = etree_html.xpath('//span[@class="pubtime" and contains(text(), "10-18")]/text()')
    # print(result)

    # 按序选择 [1] [last()] [poistion() < 3] [last() -2]
    # 节点轴
    # //li/ancestor::*  所有祖先节点
    # //li/ancestor::div div这个祖先节点
    # //li/attribute::* attribute轴,获取li节点所有属性值
    # //li/child::a[@href="link1.html"]  child轴,获取直接子节点
    # //li/descendant::span 获取所有span类型的子孙节点
    # //li/following::* 选取文档中当前节点的结束标记之后的所有节点
    # //li/following-sibling::*     选取当前节点之后的所用同级节点

    # result = etree_html.xpath('//li/ancestor::div')
    # print(result)


def main():
    html = get_one_page()
    # print(html)
    parse_with_xpath(html)


if __name__ == '__main__':
    main()


Beautiful Soup爬取

import requests
from bs4 import BeautifulSoup


# 取页面HTML
def get_one_page():
    url = "https://www.zhipin.com/c101270100-p100109/"
    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        text = response.content.decode('utf-8')
        return text
    return None


def parse_soup(html):
    soup = BeautifulSoup(html, "lxml") # 试⽤lxml解析器构造beautifulsoup
    print(soup.prettify()) # 取⽹⻚缩进格式化输出
    print(soup.title.string) # 取⽹⻚title内容
    print(soup.head)
    print(soup.p)
    # 获取节点的名字
    print(soup.title.name)
    # 获取节点属性
    soup.img.attrs["src"]print(soup.p.attrs)
    print(soup.p.attrs["name"])
    print(soup.p["class"])
    # 获取节点包含的内容
    print(soup.p.string)
    <p class="c1"><span>asdf<span>asdfasdfasdfasdfadsfad<p>
    嵌套选择
    <head>
    <title>this is title</title>
    </head>
    # soup的节点都为 bs4.element.Tag类型,可以继续选择
    print(soup.head.title.string)
    关联选择
    有些元素没有特征定位,可以先选择有办法定位的,然后以这个节点为    准选择它的⼦节点、⽗节点、兄弟节点等
    <p class="p1"></p>
    <p></p>
    <p></p>
    print(soup.p.contents) # 取p节点下⾯所有⼦节点列表
    print(soup.p.descendants) #取p节点所有⼦孙节点
    print(soup.a.parent) # 取⽗节点
    print(soup.a.parents) # 取所有祖先节点
    print(soup.a.next_sibling) # 同级下⼀节点
    print(soup.a.previous_sibling) # 同级上⼀节点
    print(soup.a.next_siblings) # 同级所有后⾯节点
    print(soup.a.previous_siblings) # 同级所有前⾯节点
    print(list(soup.a.parents)[0].attrs['class'])
⽅法选择器
根据属性和⽂本进⾏查找
<ul><li><li><ul><ul><li><li>jjj<li><li></ul>
    print(soup.find_all(name="ul"))
    for ul in soup.find_all(name="ul"):
        print(ul.find_all(name="li"))
    for li in ul.find_all(name="li"):
        print(li.string)
    soup.find_all(attrs={"id": "list-1"})
     css 选择器
    <p id="p1" class="panel"><p class=""><p><p>
    soup.select('.panel .panel_heading')
    soup.select('ul li')
    soup.select('#id1 .element')



def main():
    html = get_one_page()
    # print(html)
    parse_soup(html)


if __name__ == '__main__':
    main()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容