파이썬의 요청 + XPath는 고양이 눈 영화를 크롤링하고 데이터베이스에 기록 (사진 자습서)

A, pyhton MySQL 데이터베이스 연결

그때, 당신은 pymysql 라이브러리에 필요 고양이의 눈 평 파일을 크롤링 전화를 패키지에 평 파일을 작성, 학생들은 여기에 직접 코드에, 그것을 사전 설치하려면이 라이브러리가 없습니다

#coding=utf-8
import pymysql

class mysqlConn:
    def get_conn(self, dbname):
        """提供你要连接的数据库名,并连接数据库"""
        self.conn = pymysql.connect(
            host="127.0.0.1",
            user="root",
            password="你的密码",
            db=dbname, #可选择要连接的数据库名
            charset="utf8"
        )
        self.cur = self.conn.cursor()

    def exe_sql(self, sql):
        """执行不返回结果的sql语句, 例如增删改"""
        self.cur.execute(sql)
        self.conn.commit()
        # print("事物提交成功")

    def select_sql(self, sql):
        """执行查询语句"""
        self.cur.execute(sql)
        return self.cur.fetchall()

    def close_conn(self):
        if self.cur:
            self.cur.close()
        if self.conn:
            self.conn.close()

if __name__ == "__main__":
    #找一个数据库表来执行一下看能不能行
    connection = mysqlConn()
    connection.get_conn("school") #连接'school'数据库
    sql = '''insert into student2 (name, nickname) values ("赵六", "六娃")'''
    connection.exe_sql(sql)
    connection.close_conn()

= UTF-8이 아닌 작은 오류가 쓰기에 메시지가 표시됩니다 코딩 파일 번호의 시작이 글을 쓰는 습관 후, 전에이 습관을 작성하지 않은, 있다는 것을 참고가 될 것으로 보인다
결과를 봐
그림 삽입 설명 여기

둘째, XPath는과 유용한 정보를 잡아

고양이 눈 영화 사이트 주소 : https://maoyan.com/films?showType=3
최종 데이터베이스에서 첫번째보기는 어떤 정보를 우리가 크롤 링을 가지고 볼 수 있습니다
그림 삽입 설명 여기
당신은 우리가 영화 이름, 영화 포스터 링크를 잡아 가지고 볼 수있는 그래프에서 링크의 영화 세부 정보 페이지는 필름 및 캐스트를 소개합니다.
지금은 고양이 눈 홈에서 보면
그림 삽입 설명 여기
그림 삽입 설명 여기
여기에서 우리는 URL의 그의 변화의 법칙을 발견 할 수 있었다
다음 다른 영화에서 정보의 첫 번째 페이지의 URL을 크롤링
주소 포스터를보고
그림 삽입 설명 여기
여기에 사용 도구 플러그인 캐치 XPath는 (XPath는 도우미), 어떤 학생들은 구글 앱 스토어 다운로드에 갈 수 없다, 바로 가기 키 Ctrl 키 + 시프트 + X 빠르게 사용할 수 있습니다 설치 후
그림 삽입 설명 여기
해야 할 영화 콘텐츠의 요구 지금 집이 내용 확인을, 크롤링 세부 정보 페이지를 잡기 위해 나머지 내용의 요구를 완료,하자가 효과 크롤링을 볼 수있는 가정을위한 코드를 작성

#coding=utf-8
import requests
from lxml import etree
from fake_useragent import UserAgent

# 这里用了一个可以随机模拟请求头的库,因为一天内爬太多次导致频繁要验证,用随意模拟的请求头会好很多
# 感兴趣的小伙伴可以自己'pip install fake_useragent', 不感兴趣可以直接用普通的请求头
headers = {
    "User-Agent": UserAgent().random
}
url = 'https://maoyan.com/films?showType=3'
print("url: " + url)
resp = requests.get(url=url, headers=headers)
tree = etree.HTML(resp.text)
# 完整的图片地址,可以直接打开
img_ar = tree.xpath('//dl/dd//img[2]/@src')
# 只有地址的后半段,需要拼接'https://maoyan.com/'
urls_ar = tree.xpath('//dd/div[@class="movie-item film-channel"]/a/@href')

#打印出来看看数据爬到没有
print(img_ar)
print(urls_ar)

그림 삽입 설명 여기
사진 주소는 ??? 장소 여기, 정말 분할 나는 또한 잠시 동안 무지 힘이다 캐치하지 않았다 세부 정보 페이지 주소를 잡은 찾기, 그의 XPath는 쓰기에 대해 지금은 디버그를 보인다하지 않았다 생각, 우리는 히트 브레이크 포인트
그림 삽입 설명 여기
우리가 사진을 변경 XPATH 크롤링합니다 지금을 '// ㎗ / DD // IMG [ 2] / @ 데이터 SRC' , 다시 시도가 성공적으로 크롤링 할 수 있었다 발견
하고 지금 우리는 캡처 상세 화면 정보를 가지고 캐스트
영화 이름 및 프로필 잘 잡힌, 나는이되어 부착 된 XPath를 가지고, 당신이 소유 할 수있는 것, 스크린 샷 및 긁힌되지 않습니다
그림 삽입 설명 여기
당신이 다른 제제를 시도 할 수 있습니다 반복하지 않는 경우
세부 사항을 크롤링의 코드 페이지를

headers = {
    "User-Agent": UserAgent().random
}
url = 'https://maoyan.com/films/1218029'

print("url: " + url)
resp = requests.get(url=url, headers=headers)

tree = etree.HTML(resp.content.decode("utf-8"))
name = str(tree.xpath('string(//h1)')) #转为py内置的str类型,保险点
print("正在储存电影<{}>......".format(name))
actors_ar = tree.xpath('//div[@class="celebrity-group"][2]//li/div[@class="info"]/a/text()')  # 演员列表
types = tree.xpath('string(//li[@class="ellipsis"])').replace("\n", "").replace(" ", "")  # 字符串
intro = str(tree.xpath('string(//span[@class="dra"])'))
actors = '|'.join(actors_ar).replace("\n", "").replace(" ", "") #将演员列表拼接为字符串

충족되지 확인 코드가 상승 할 수있을 것입니다 경우,보기에 자신의 결과를 인쇄 할 수 있습니다

마지막으로, 패키지로 모든 코드 크롤링 고양이의 눈 영화는 좋은 습관 코드를 개발하는

import requests
from lxml import etree
from mysql_api import mysqlConn
from fake_useragent import UserAgent
from pymysql import err

class maoYan_spider:
    headers = {
        "User-Agent": UserAgent().random
    }
    def get_urls(self, url):
        """返回一个电影首页捕获到的所有海报地址和电影详情url"""
        print("url: " + url)
        resp = requests.get(url=url, headers=self.headers)
        tree = etree.HTML(resp.text)
        # 完整的图片地址,可以直接打开
        img_ar = tree.xpath('//dl/dd//img[2]/@data-src')
        # 只有地址的后半段,需要拼接'https://maoyan.com'
        urls_ar = tree.xpath('//dd/div[@class="movie-item film-channel"]/a/@href')
        #只有py具有返回多个参数的特性,其他语言只能返回一个
        return img_ar, urls_ar

    def save_data(self, img_src, url):
        """将电影详情写入数据库"""
        #print("url: " + url)
        resp = requests.get(url=url, headers=self.headers)

        tree = etree.HTML(resp.content.decode("utf-8"))
        name = str(tree.xpath('string(//h1)'))
        print("正在储存电影<{}>......".format(name))
        if name == "":
            print("遇到验证码, 程序停止")
            return False
        actors_ar = tree.xpath('//div[@class="celebrity-group"][2]//li/div[@class="info"]/a/text()')  # 演员列表
        types = tree.xpath('string(//li[@class="ellipsis"])').replace("\n", "").replace(" ", "")  # 字符串
        intro = str(tree.xpath('string(//span[@class="dra"])'))
        actors = '|'.join(actors_ar).replace("\n", "").replace(" ", "") #将演员列表拼接为字符串
        sql = 'insert into maoyan (m_name, m_type, m_src, m_link, m_intro, m_actors) values ("%s","%s","%s","%s","%s","%s")' % (name, types, img_src, url, intro, actors)
        try:
            self.connect.exe_sql(sql)
        except err.ProgrammingError:
            print("该条编码有问题,舍弃")
        return True
    def run(self):
        self.connect = mysqlConn()
        self.connect.get_conn("movies")
        tag = True
        #爬取前两页的电影
        for i in range(2):
            main_url = "https://maoyan.com/films?showType=3&offset={}".format(30 * i)
            imgs, urls = self.get_urls(main_url)
            if len(imgs) == 0:
                print("遇到验证码, 程序停止")
                print("再次尝试...")
                imgs, urls = self.get_urls(main_url)
            for img, url in zip(imgs, urls):
                img = img.split('@')[0]
                url = 'https://maoyan.com' + url
                tag = self.save_data(img, url)
                while not tag:
                    tag = True
                    print("再次尝试...")
                    tag = self.save_data(img, url)
        self.connect.close_conn()

if __name__ == "__main__":
    # conn1 = mysqlConn()
    # conn1.get_conn("movies")
    # sql = """create table maoyan(
    #         m_id int primary key auto_increment,
    #         m_name varchar(30) not null,
    #         m_type varchar(20) null,
    #         m_src varchar(100) not null,
    #         m_link varchar(100) not NULL,
    #         m_intro text null,
    #         m_actors text null
    #         )default charset = utf8"""
    # conn1.exe_sql(sql)
    # conn1.close_conn()
    spider = maoYan_spider()
    spider.run()

그림 삽입 설명 여기
나는 데이터베이스 파일과 파일 크롤링에 연결 아마도 라인에 같은 디렉토리에, 동일한에게 다음 페이지를 작성하고 다음 '.mysql_api 수입 mysqlConn에서'와 가진 영화를 잡을 수있는 곳이다

상대적으로 쉬운 몇 장소 밖으로 구덩이 말했다

그림 삽입 설명 여기
이것은 당신이 MySQL 데이터베이스에 내장에서 자신의 영화를 가지고 제공, 테이블을 구축하는 코드의 조각
이 단락 후 주석, 주석으로 코드의 첫 번째 두 라인은 다음 실행 한 후 실행 경고 문자 세트 인코딩이있을 것이다, 이 실행의 끝은 당신이 코드 조각을 언급 할 수 있고, 나는 단지 평 CRUD를 작성하기 전에하기 때문에 후 주석 다음 두 줄은 시작 파충류는 물론, 당신은 또한 데이터베이스의 첫 번째 테이블을 구축 할 수 있습니다, 중요하지 않습니다 텍스트 형식 m_actors는 원래 쓰기에 VARCHAR (200), 나중에 프롬프트 충분히 준 이유를 묻지 않는 테이블을 구축 원했고, 변화 (400)는 내가 너무 많이 볼 수있는 배우를 보러 갔다, 충분하지 않다 - 복잡 미국

그림 삽입 설명 여기
이 SQL 문을 큰 따옴표의 양쪽에 자리 표시 자에주의를 기울이 (데이터베이스에 특별한 의미가 있기 때문에 특히 아직 모르는 무엇을, 나는 기사가 이렇게 말한다 체크, 작은 따옴표 큰 따옴표해야합니다), 나는 내부를했다 작은 따옴표와 큰 따옴표는 외부 우리 만 예외를 잡을 수있는, 내가 문제를 찾을 수 없습니다 'pymysql.err.ProgrammingError'으로 이어질 것입니다 여러 페이지에 이르는, SQL로 포장하고, 나중에 작은 따옴표로 변경 이 뭔가 잘못이 아니다.

오늘 자신의 독립적 인 작업을 잡은 완료, 비디오를 볼 수 없습니다 파충류를 배우는 처음 며칠로 간주하기 때문에 코멘트 영역 메시지에서 논의 될 수있는 다른 문제가있다, 헤 헤

효과

그림 삽입 설명 여기

게시 된 원본 기사 · 원의 찬양 9 · 전망 (54)

추천

출처blog.csdn.net/weixin_43110554/article/details/105225737