Python 爬虫Start

Demo

终于开始学习Python的爬虫,刚刚入门。但是现在对于我来说一般的静态网站爬下来没有问题了。

所以来说说这几天三个小Dome的思路。

豆瓣电影的TOP250

第一个小Dome是“豆瓣电影的TOP250”的爬取,因为喜欢看电影,所以选了豆瓣来爬。用到的也是最基础的requests库以及re,辅助于正则表达式。最开始对正则还是有所压力的,但是接触之后才发现其实简单的爬取所需要的正则挺简单。

首先

我们需要一口进入到豆瓣电影,一般而言就是TOP250的首页:https://movie.douban.com/top250?start=0,发现start后的值其实就是翻转的页数,也就是说当“start=25”跳转到下一页。为什么是25呢?因一页有25部电影啊~然后我通过观察发现每一页的布局整体而言是相同的,也就是说只要我们能够爬取一页我们需要的信息,那么通过遍历我们也就获得了所有需要的电影信息。
我们需要什么?

  • 电影名称
  • 导演
  • 主演
  • 评分
  • 评价人数
  • 海报

    分析这些信息所在页面的位置

通过chrome(或者别的浏览器)的检查,一部电影的信息全部在一个li标签下,那么知道这些信息之后我们就可以通过正则表达式来筛选我们需要的信息。

def get_one_page(url):#页数选择
    try:
        response=requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None
def parse_one_page(html):
    pattern = re.compile('<img.*?src="(.*?)".*?title">(.*?)\
        </span>.*?"">(.*?)<.p>.*?age">(.*?)</span>.*?\
        <span>(.*?)</span>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        print(item)

def main(url):#主方法

    html = get_one_page(url)
    parse_one_page(html)
    # print(url)

if __name__ == '__main__':
    url = 'https://movie.douban.com/top250?start='
    url1='&filter='
    for i in range(0, 225, 25):
        url3 = url+str(i)+url1
        main(url3)

‘response=requests.get(url)’,requests.get(url)会解码服务器的内容,’response.text’将网站的源码解析出来。’re.compile()’的两个参数分别是正则表达式,和跨行。没有re.S是不能进行跨行搜索的。然后在将传到’re.findall()’查找所有正则表达式里的信息,然后进行输出,我们得到的’items = re.findall(pattern, html)’是一个结果集,所以需要遍历。

结果



爬取猫眼电影TOP100

猫眼电大体上与豆瓣电影的方法相同,只不过我试着把数据存放在数据库中。

数据库.test

def get_page(url):##将爬取到的数据存入自己的数据库
    html = requests.get(url, headers=headers)
    # Mysql = Set_Mysql()
    # Mysql.add(Mysql.cursor,data)
    connect = pymysql.Connect(
        host='xxx.xxx.xxx.xxx',
        port=3306,
        user='root',
        passwd='root',
        db='Python',
        charset='utf8'
    )
    cursor = connect.cursor()


    for item in requstst_paly(html.text):
        name = item.get('name')
        foot = item.get('foot')
        time = item.get('time')
        mark = item.get('mark')
        img = item.get('img')
        data = (name, foot, time, mark, img)
        sql = "INSERT INTO CatEyeMovie (MovieName, Protagonist
            , ReleasedTime
            ,Score,Poster) VALUES ( '%s', '%s', '%s','%s','%s')"
        cursor.execute(sql % data)
        print(mark)

    connect.commit()


def requstst_paly(html):##用正则表达式提取信息,使用“yield”创造字典
    pattern = re.compile(
        '<img data-src="(.*?)@.*?".*?"name".*?">/
        (.*?)</a>.*?star">(.*?)</p>.*?time">/
        (.*?)</p>.*?ger">(\d.).*?">(\d)</i>',  re.S)
    items = re.findall(pattern, html)

    for movie in items:
        yield {
            'name': movie[1],
            'foot': movie[2].strip()[3:],
            'time': movie[3].strip()[5:],
            'mark': movie[4] + movie[5],
            'img': movie[0]
        }

我们创造一个构造器,将爬取到的信息存到字典。

for movie in items:
    yield {
        'name': movie[1],
        'foot': movie[2].strip()[3:],
        'time': movie[3].strip()[5:],
        'mark': movie[4] + movie[5],
        'img': movie[0]
    }

因为对Python还是不很熟悉,原本想写个类来封装数据库链接,但是后来发现对于我来说不是很好实现,索性就加入到方法中了。需要注意的是在加入’import pymysql.cursors’,还有在创建表的时候需要注意字符个数,不然就会报错,不然就很难受~

结果





爬取3DM游戏排行榜迅雷下载地址

室友说:诶,你最近在学爬虫?你帮我把游戏的下载地址爬取下来吧,不然每